ZGlmZiAtLWdpdCBhL0RlbW8vY2dpL1JFQURNRSBiL0RlbW8vY2dpL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA2MzFiNi4uMDAwMDAwMAotLS0gYS9EZW1vL2NnaS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1DR0kgRXhhbXBsZXMKLS0tLS0tLS0tLS0tLQotCi1IZXJlIGFyZSBzb21lIGV4YW1wbGUgQ0dJIHByb2dyYW1zLgotCi1jZ2kwLnNoIC0tIEEgc2hlbGwgc2NyaXB0IHRvIHRlc3QgeW91ciBzZXJ2ZXIgaXMgY29uZmlndXJlZCBmb3IgQ0dJCi1jZ2kxLnB5IC0tIEEgUHl0aG9uIHNjcmlwdCB0byB0ZXN0IHlvdXIgc2VydmVyIGlzIGNvbmZpZ3VyZWQgZm9yIENHSQotY2dpMi5weSAtLSBBIFB5dGhvbiBzY3JpcHQgc2hvd2luZyBob3cgdG8gcGFyc2UgYSBmb3JtCi1jZ2kzLnB5IC0tIEEgUHl0aG9uIHNjcmlwdCBmb3IgZHJpdmluZyBhbiBhcmJpdHJhcnkgQ0dJIGFwcGxpY2F0aW9uCi13aWtpLnB5IC0tIFNhbXBsZSBDR0kgYXBwbGljYXRpb246IGEgbWluaW1hbCBXaWtpIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9EZW1vL2NnaS9jZ2kwLnNoIGIvRGVtby9jZ2kvY2dpMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWNlZmNkMy4uMDAwMDAwMAotLS0gYS9EZW1vL2NnaS9jZ2kwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgSWYgeW91IGNhbid0IGdldCB0aGlzIHRvIHdvcmssIHlvdXIgd2ViIHNlcnZlciBpc24ndCBzZXQgdXAgcmlnaHQKLQotZWNobyBDb250ZW50LXR5cGU6IHRleHQvcGxhaW4KLWVjaG8KLWVjaG8gSGVsbG8gd29ybGQKLWVjaG8gVGhpcyBpcyBjZ2kwLnNoCmRpZmYgLS1naXQgYS9EZW1vL2NnaS9jZ2kxLnB5IGIvRGVtby9jZ2kvY2dpMS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYjQxNTRkZi4uMDAwMDAwMAotLS0gYS9EZW1vL2NnaS9jZ2kxLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotCi0iIiJDR0kgdGVzdCAxIC0gY2hlY2sgc2VydmVyIHNldHVwLiIiIgotCi0jIFVudGlsIHlvdSBnZXQgdGhpcyB0byB3b3JrLCB5b3VyIHdlYiBzZXJ2ZXIgaXNuJ3Qgc2V0IHVwIHJpZ2h0IG9yCi0jIHlvdXIgUHl0aG9uIGlzbid0IHNldCB1cCByaWdodC4KLQotIyBJZiBjZ2kwLnNoIHdvcmtzIGJ1dCBjZ2kxLnB5IGRvZXNuJ3QsIGNoZWNrIHRoZSAjISBsaW5lIGFuZCB0aGUgZmlsZQotIyBwZXJtaXNzaW9ucy4gIFRoZSBkb2NzIGZvciB0aGUgY2dpLnB5IG1vZHVsZSBoYXZlIGRlYnVnZ2luZyB0aXBzLgotCi1wcmludCgiQ29udGVudC10eXBlOiB0ZXh0L2h0bWwiKQotcHJpbnQoKQotcHJpbnQoIjxoMT5IZWxsbyB3b3JsZDwvaDE+IikKLXByaW50KCI8cD5UaGlzIGlzIGNnaTEucHkiKQpkaWZmIC0tZ2l0IGEvRGVtby9jZ2kvY2dpMi5weSBiL0RlbW8vY2dpL2NnaTIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhYTU3YjMuLjAwMDAwMDAKLS0tIGEvRGVtby9jZ2kvY2dpMi5weQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLQotIiIiQ0dJIHRlc3QgMiAtIGJhc2ljIHVzZSBvZiBjZ2kgbW9kdWxlLiIiIgotCi1pbXBvcnQgY2dpdGI7IGNnaXRiLmVuYWJsZSgpCi0KLWltcG9ydCBjZ2kKLQotZGVmIG1haW4oKToKLSAgICBmb3JtID0gY2dpLkZpZWxkU3RvcmFnZSgpCi0gICAgcHJpbnQoIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sIikKLSAgICBwcmludCgpCi0gICAgaWYgbm90IGZvcm06Ci0gICAgICAgIHByaW50KCI8aDE+Tm8gRm9ybSBLZXlzPC9oMT4iKQotICAgIGVsc2U6Ci0gICAgICAgIHByaW50KCI8aDE+Rm9ybSBLZXlzPC9oMT4iKQotICAgICAgICBmb3Iga2V5IGluIGZvcm0ua2V5cygpOgotICAgICAgICAgICAgdmFsdWUgPSBmb3JtW2tleV0udmFsdWUKLSAgICAgICAgICAgIHByaW50KCI8cD4iLCBjZ2kuZXNjYXBlKGtleSksICI6IiwgY2dpLmVzY2FwZSh2YWx1ZSkpCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9EZW1vL2NnaS9jZ2kzLnB5IGIvRGVtby9jZ2kvY2dpMy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU4ZWY2NS4uMDAwMDAwMAotLS0gYS9EZW1vL2NnaS9jZ2kzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotCi0iIiJDR0kgdGVzdCAzIChwZXJzaXN0ZW50IGRhdGEpLiIiIgotCi1pbXBvcnQgY2dpdGI7IGNnaXRiLmVuYWJsZSgpCi0KLWZyb20gd2lraSBpbXBvcnQgbWFpbgotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvRGVtby9jZ2kvd2lraS5weSBiL0RlbW8vY2dpL3dpa2kucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTcxMTMuLjAwMDAwMDAKLS0tIGEvRGVtby9jZ2kvd2lraS5weQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0iIiJXaWtpIG1haW4gcHJvZ3JhbS4gIEltcG9ydGVkIGFuZCBydW4gYnkgY2dpMy5weS4iIiIKLQotaW1wb3J0IG9zLCByZSwgY2dpLCBzeXMsIHRlbXBmaWxlCi1lc2NhcGUgPSBjZ2kuZXNjYXBlCi0KLWRlZiBtYWluKCk6Ci0gICAgZm9ybSA9IGNnaS5GaWVsZFN0b3JhZ2UoKQotICAgIHByaW50KCJDb250ZW50LXR5cGU6IHRleHQvaHRtbCIpCi0gICAgcHJpbnQoKQotICAgIGNtZCA9IGZvcm0uZ2V0dmFsdWUoImNtZCIsICJ2aWV3IikKLSAgICBwYWdlID0gZm9ybS5nZXR2YWx1ZSgicGFnZSIsICJGcm9udFBhZ2UiKQotICAgIHdpa2kgPSBXaWtpUGFnZShwYWdlKQotICAgIG1ldGhvZCA9IGdldGF0dHIod2lraSwgJ2NtZF8nICsgY21kLCBOb25lKSBvciB3aWtpLmNtZF92aWV3Ci0gICAgbWV0aG9kKGZvcm0pCi0KLWNsYXNzIFdpa2lQYWdlOgotCi0gICAgaG9tZWRpciA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQotICAgIHNjcmlwdHVybCA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6Ci0gICAgICAgIGlmIG5vdCBzZWxmLmlzd2lraXdvcmQobmFtZSk6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwYWdlIG5hbWUgaXMgbm90IGEgd2lraSB3b3JkIikKLSAgICAgICAgc2VsZi5uYW1lID0gbmFtZQotICAgICAgICBzZWxmLmxvYWQoKQotCi0gICAgZGVmIGNtZF92aWV3KHNlbGYsIGZvcm0pOgotICAgICAgICBwcmludCgiPGgxPiIsIGVzY2FwZShzZWxmLnNwbGl0d2lraXdvcmQoc2VsZi5uYW1lKSksICI8L2gxPiIpCi0gICAgICAgIHByaW50KCI8cD4iKQotICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmRhdGEuc3BsaXRsaW5lcygpOgotICAgICAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKLSAgICAgICAgICAgIGlmIG5vdCBsaW5lOgotICAgICAgICAgICAgICAgIHByaW50KCI8cD4iKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludChzZWxmLmZvcm1hdGxpbmUobGluZSkpCi0gICAgICAgIHByaW50KCI8aHI+IikKLSAgICAgICAgcHJpbnQoIjxwPiIsIHNlbGYubWtsaW5rKCJlZGl0Iiwgc2VsZi5uYW1lLCAiRWRpdCB0aGlzIHBhZ2UiKSArICI7IikKLSAgICAgICAgcHJpbnQoc2VsZi5ta2xpbmsoInZpZXciLCAiRnJvbnRQYWdlIiwgImdvIHRvIGZyb250IHBhZ2UiKSArICIuIikKLQotICAgIGRlZiBmb3JtYXRsaW5lKHNlbGYsIGxpbmUpOgotICAgICAgICB3b3JkcyA9IFtdCi0gICAgICAgIGZvciB3b3JkIGluIHJlLnNwbGl0KCcoXFcrKScsIGxpbmUpOgotICAgICAgICAgICAgaWYgc2VsZi5pc3dpa2l3b3JkKHdvcmQpOgotICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNlbGYubWtmaWxlKHdvcmQpKToKLSAgICAgICAgICAgICAgICAgICAgd29yZCA9IHNlbGYubWtsaW5rKCJ2aWV3Iiwgd29yZCwgd29yZCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICB3b3JkID0gc2VsZi5ta2xpbmsoIm5ldyIsIHdvcmQsIHdvcmQgKyAiKiIpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHdvcmQgPSBlc2NhcGUod29yZCkKLSAgICAgICAgICAgIHdvcmRzLmFwcGVuZCh3b3JkKQotICAgICAgICByZXR1cm4gIiIuam9pbih3b3JkcykKLQotICAgIGRlZiBjbWRfZWRpdChzZWxmLCBmb3JtLCBsYWJlbD0iQ2hhbmdlIik6Ci0gICAgICAgIHByaW50KCI8aDE+IiwgbGFiZWwsIHNlbGYubmFtZSwgIjwvaDE+IikKLSAgICAgICAgcHJpbnQoJzxmb3JtIG1ldGhvZD0iUE9TVCIgYWN0aW9uPSIlcyI+JyAlIHNlbGYuc2NyaXB0dXJsKQotICAgICAgICBzID0gJzx0ZXh0YXJlYSBjb2xzPSI3MCIgcm93cz0iMjAiIG5hbWU9InRleHQiPiVzPC90ZXh0YXJlYT4nCi0gICAgICAgIHByaW50KHMgJSBzZWxmLmRhdGEpCi0gICAgICAgIHByaW50KCc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjbWQiIHZhbHVlPSJjcmVhdGUiPicpCi0gICAgICAgIHByaW50KCc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJwYWdlIiB2YWx1ZT0iJXMiPicgJSBzZWxmLm5hbWUpCi0gICAgICAgIHByaW50KCc8YnI+JykKLSAgICAgICAgcHJpbnQoJzxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSIlcyBQYWdlIj4nICUgbGFiZWwpCi0gICAgICAgIHByaW50KCI8L2Zvcm0+IikKLQotICAgIGRlZiBjbWRfY3JlYXRlKHNlbGYsIGZvcm0pOgotICAgICAgICBzZWxmLmRhdGEgPSBmb3JtLmdldHZhbHVlKCJ0ZXh0IiwgIiIpLnN0cmlwKCkKLSAgICAgICAgZXJyb3IgPSBzZWxmLnN0b3JlKCkKLSAgICAgICAgaWYgZXJyb3I6Ci0gICAgICAgICAgICBwcmludCgiPGgxPkknbSBzb3JyeS4gIFRoYXQgZGlkbid0IHdvcms8L2gxPiIpCi0gICAgICAgICAgICBwcmludCgiPHA+QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZmlsZToiKQotICAgICAgICAgICAgcHJpbnQoIjxwPiIsIGVzY2FwZShlcnJvcikpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIFVzZSBhIHJlZGlyZWN0IGRpcmVjdGl2ZSwgdG8gYXZvaWQgInJlbG9hZCBwYWdlIiBwcm9ibGVtcwotICAgICAgICAgICAgcHJpbnQoIjxoZWFkPiIpCi0gICAgICAgICAgICBzID0gJzxtZXRhIGh0dHAtZXF1aXY9InJlZnJlc2giIGNvbnRlbnQ9IjE7IFVSTD0lcyI+JwotICAgICAgICAgICAgcHJpbnQocyAlIChzZWxmLnNjcmlwdHVybCArICI/Y21kPXZpZXcmcGFnZT0iICsgc2VsZi5uYW1lKSkKLSAgICAgICAgICAgIHByaW50KCI8aGVhZD4iKQotICAgICAgICAgICAgcHJpbnQoIjxoMT5PSzwvaDE+IikKLSAgICAgICAgICAgIHByaW50KCI8cD5JZiBub3RoaW5nIGhhcHBlbnMsIHBsZWFzZSBjbGljayBoZXJlOiIsIGVuZD0nICcpCi0gICAgICAgICAgICBwcmludChzZWxmLm1rbGluaygidmlldyIsIHNlbGYubmFtZSwgc2VsZi5uYW1lKSkKLQotICAgIGRlZiBjbWRfbmV3KHNlbGYsIGZvcm0pOgotICAgICAgICBzZWxmLmNtZF9lZGl0KGZvcm0sIGxhYmVsPSJDcmVhdGUiKQotCi0gICAgZGVmIGlzd2lraXdvcmQoc2VsZiwgd29yZCk6Ci0gICAgICAgIHJldHVybiByZS5tYXRjaCgiW0EtWl1bYS16XSsoW0EtWl1bYS16XSopKyIsIHdvcmQpCi0KLSAgICBkZWYgc3BsaXR3aWtpd29yZChzZWxmLCB3b3JkKToKLSAgICAgICAgY2hhcnMgPSBbXQotICAgICAgICBmb3IgYyBpbiB3b3JkOgotICAgICAgICAgICAgaWYgY2hhcnMgYW5kIGMuaXN1cHBlcigpOgotICAgICAgICAgICAgICAgIGNoYXJzLmFwcGVuZCgnICcpCi0gICAgICAgICAgICBjaGFycy5hcHBlbmQoYykKLSAgICAgICAgcmV0dXJuICIiLmpvaW4oY2hhcnMpCi0KLSAgICBkZWYgbWtmaWxlKHNlbGYsIG5hbWU9Tm9uZSk6Ci0gICAgICAgIGlmIG5hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIG5hbWUgPSBzZWxmLm5hbWUKLSAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmhvbWVkaXIsIG5hbWUgKyAiLnR4dCIpCi0KLSAgICBkZWYgbWtsaW5rKHNlbGYsIGNtZCwgcGFnZSwgdGV4dCk6Ci0gICAgICAgIGxpbmsgPSBzZWxmLnNjcmlwdHVybCArICI/Y21kPSIgKyBjbWQgKyAiJnBhZ2U9IiArIHBhZ2UKLSAgICAgICAgcmV0dXJuICc8YSBocmVmPSIlcyI+JXM8L2E+JyAlIChsaW5rLCB0ZXh0KQotCi0gICAgZGVmIGxvYWQoc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYubWtmaWxlKCkpCi0gICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkuc3RyaXAoKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIGV4Y2VwdCBJT0Vycm9yOgotICAgICAgICAgICAgZGF0YSA9ICIiCi0gICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKLQotICAgIGRlZiBzdG9yZShzZWxmKToKLSAgICAgICAgZGF0YSA9IHNlbGYuZGF0YQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmID0gb3BlbihzZWxmLm1rZmlsZSgpLCAidyIpCi0gICAgICAgICAgICBmLndyaXRlKGRhdGEpCi0gICAgICAgICAgICBpZiBkYXRhIGFuZCBub3QgZGF0YS5lbmRzd2l0aCgnXG4nKToKLSAgICAgICAgICAgICAgICBmLndyaXRlKCdcbicpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHJldHVybiAiIgotICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlcnI6Ci0gICAgICAgICAgICByZXR1cm4gIklPRXJyb3I6ICVzIiAlIHN0cihlcnIpCmRpZmYgLS1naXQgYS9EZW1vL2NvbXBhcmlzb25zL1JFQURNRSBiL0RlbW8vY29tcGFyaXNvbnMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTE2NjdjLi4wMDAwMDAwCi0tLSBhL0RlbW8vY29tcGFyaXNvbnMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotU3ViamVjdDogUmU6IFdoYXQgbGFuZ3VhZ2Ugd291bGQgeW91IHVzZT8KLUZyb206IFRvbSBDaHJpc3RpYW5zZW4gPHRjaHJpc3RAbW94LnBlcmwuY29tPgotRGF0ZTogNiBOb3YgMTk5NCAxNToxNDo1MSBHTVQKLU5ld3Nncm91cHM6IGNvbXAubGFuZy5weXRob24sY29tcC5sYW5nLnRjbCxjb21wLmxhbmcuc2NoZW1lLGNvbXAubGFuZy5taXNjLGNvbXAubGFuZy5wZXJsCi1NZXNzYWdlLUlkOiA8MzlpcnRiJDN0NEBjc25ld3MuY3MuQ29sb3JhZG8uRURVPgotUmVmZXJlbmNlczogPDM5YjdoYSRqOXZAemVuby5uc2NmLm9yZz4gPDM5aGhqcCRsZ25AY3NuZXdzLmNzLkNvbG9yYWRvLkVEVT4gPDM5aHZzdSRkdXNAbWF0aHNlcnYubXBzLm9oaW8tc3RhdGUuZWR1PgotCi1bLi4uXQotSWYgeW91J3JlIHJlYWxseSBpbnRvIGJlbmNobWFya3MsIEknZCBsb3ZlIGl0IGlmIHNvbWVvbmUgd2VyZSB0byBjb2RlIHVwCi10aGUgZm9sbG93aW5nIHByb2JsZW1zIGluIHRjbCwgcHl0aG9uLCBhbmQgc2NoZW1lIChhbmQgd2hhdGV2ZXIgZWxzZSB5b3UnZAotbGlrZSkuICBTZXBhcmF0ZSB2ZXJzaW9ucyAob25lIG9wdGltaXplZCBmb3Igc3BlZWQsIG9uZSBmb3IgYmVhdXR5IDotKSBhcmUKLW9rLiAgUG9zdCB5b3VyIGNvZGUgc28gd2UgY2FuIHRpbWUgaXQgb24gb3VyIG93biBzeXN0ZW1zLgotCi0wKSAgRmFjdG9yaWFsIFRlc3QgIChudW1lcmljcyBhbmQgZnVuY3Rpb24gY2FsbHMpCi0KLSAgICAgICAgKHdlIGRpZCB0aGlzIGFscmVhZHkpCi0KLTEpICBSZWd1bGFyIEV4cHJlc3Npb25zIFRlc3QKLQotICAgIFJlYWQgYSBmaWxlIG9mIChleHRlbmRlZCBwZXIgZWdyZXApIHJlZ3VsYXIgZXhwcmVzc2lvbnMgKG9uZSBwZXIgbGluZSksIAotICAgIGFuZCBhcHBseSB0aG9zZSB0byBhbGwgZmlsZXMgd2hvc2UgbmFtZXMgYXJlIGxpc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgotICAgIEJhc2ljYWxseSwgYW4gJ2VncmVwIC1mJyBzaW11bGF0b3IuICBUZXN0IGl0IHdpdGggMjAgInZ0MTAwIiBwYXR0ZXJucwotICAgIGFnYWluc3QgYSBmaXZlIC9ldGMvdGVybWNhcCBmaWxlcy4gIFRlc3RzIHVzaW5nIG1vcmUgZWxhYm9yYXRlIHBhdHRlcnMKLSAgICB3b3VsZCBhbHNvIGJlIGludGVyZXN0aW5nLiAgWW91ciBjb2RlIHNob3VsZCBub3QgYnJlYWsgaWYgZ2l2ZW4gaHVuZHJlZHMKLSAgICBvZiByZWd1bGFyIGV4cHJlc3Npb25zIG9yIGJpbmFyeSBmaWxlcyB0byBzY2FuLiAgCi0KLTIpICBTb3J0aW5nIFRlc3QKLQotICAgIFNvcnQgYW4gaW5wdXQgZmlsZSB0aGF0IGNvbnNpc3RzIG9mIGxpbmVzIGxpa2UgdGhpcwotCi0gICAgICAgIHZhcjE9MjMgb3RoZXI9MTQgZGl0dG89MjMgZnJlZD0yCi0KLSAgICBzdWNoIHRoYXQgZWFjaCBvdXRwdXQgbGluZSBpcyBzb3J0ZWQgV1JUIHRvIHRoZSBudW1iZXIuICBPcmRlcgotICAgIG9mIG91dHB1dCBsaW5lcyBkb2VzIG5vdCBjaGFuZ2UuICBSZXNvbHZlIGNvbGxpc2lvbnMgdXNpbmcgdGhlCi0gICAgdmFyaWFibGUgbmFtZS4gICBlLmcuCi0KLSAgICAgICAgZnJlZD0yIG90aGVyPTE0IGRpdHRvPTIzIHZhcjE9MjMgCi0KLSAgICBMaW5lcyBtYXkgYmUgdXAgdG8gc2V2ZXJhbCBraWxvYnl0ZXMgaW4gbGVuZ3RoIGFuZCBjb250YWluCi0gICAgemlsbGlvbnMgb2YgdmFyaWFibGVzLgotCi0zKSAgU3lzdGVtIFRlc3QKLQotICAgIEdpdmVuIGEgbGlzdCBvZiBkaXJlY3RvcmllcywgcmVwb3J0IGFueSBib2d1cyBzeW1ib2xpYyBsaW5rcyBjb250YWluZWQKLSAgICBhbnl3aGVyZSBpbiB0aG9zZSBzdWJ0cmVlcy4gIEEgYm9ndXMgc3ltYm9saWMgbGluayBpcyBvbmUgdGhhdCBjYW5ub3QKLSAgICBiZSByZXNvbHZlZCBiZWNhdXNlIGl0IHBvaW50cyB0byBhIG5vbmV4aXN0ZW50IG9yIG90aGVyd2lzZQotICAgIHVucmVzb2x2YWJsZSBmaWxlLiAgRG8gKm5vdCogdXNlIGFuIGV4dGVybmFsIGZpbmQgZXhlY3V0YWJsZS4KLSAgICBEaXJlY3RvcmllcyBtYXkgYmUgdmVyeSB2ZXJ5IGRlZXAuICBQcmludCBhIHdhcm5pbmcgaW1tZWRpYXRlbHkgaWYgdGhlCi0gICAgc3lzdGVtIHlvdSdyZSBydW5uaW5nIG9uIGRvZXNuJ3Qgc3VwcG9ydCBzeW1ib2xpYyBsaW5rcy4KLQotCi1JJ2xsIHBvc3QgcGVybCBzb2x1dGlvbnMgaWYgcGVvcGxlIHBvc3QgdGhlIG90aGVycy4KLQotCi0tLXRvbQotLS0gCi1Ub20gQ2hyaXN0aWFuc2VuICAgICAgUGVybCBDb25zdWx0YW50LCBHYW1lciwgSGlrZXIgICAgICB0Y2hyaXN0QG1veC5wZXJsLmNvbQotCi0gIkJ1dCBCaWxseSEgQSAqc21hbGwqIGFsbG93YW5jZSBwcmVwYXJlcyB5b3UgZm9yIGEgbGlmZXRpbWUgb2Ygc21hbGwKLSBzYWxhcmllcyBhbmQgZm9yIHlvdXIgU29jaWFsIFNlY3VyaXR5IHBheW1lbnRzLiIgICAgLS1GYW1pbHkgQ2lyY3VzCmRpZmYgLS1naXQgYS9EZW1vL2NvbXBhcmlzb25zL3BhdHRlcm5zIGIvRGVtby9jb21wYXJpc29ucy9wYXR0ZXJucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjRkYTg0Ni4uMDAwMDAwMAotLS0gYS9EZW1vL2NvbXBhcmlzb25zL3BhdHRlcm5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1eZGVmIAotXmNsYXNzIAotXmltcG9ydCAKLV5mcm9tIApkaWZmIC0tZ2l0IGEvRGVtby9jb21wYXJpc29ucy9yZWdleHRlc3QucHkgYi9EZW1vL2NvbXBhcmlzb25zL3JlZ2V4dGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNTQ3ZWUwZC4uMDAwMDAwMAotLS0gYS9EZW1vL2NvbXBhcmlzb25zL3JlZ2V4dGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24zCi0KLSMgMSkgIFJlZ3VsYXIgRXhwcmVzc2lvbnMgVGVzdAotIwotIyAgICAgUmVhZCBhIGZpbGUgb2YgKGV4dGVuZGVkIHBlciBlZ3JlcCkgcmVndWxhciBleHByZXNzaW9ucyAob25lIHBlciBsaW5lKSwKLSMgICAgIGFuZCBhcHBseSB0aG9zZSB0byBhbGwgZmlsZXMgd2hvc2UgbmFtZXMgYXJlIGxpc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgotIyAgICAgQmFzaWNhbGx5LCBhbiAnZWdyZXAgLWYnIHNpbXVsYXRvci4gIFRlc3QgaXQgd2l0aCAyMCAidnQxMDAiIHBhdHRlcm5zCi0jICAgICBhZ2FpbnN0IGEgZml2ZSAvZXRjL3Rlcm1jYXAgZmlsZXMuICBUZXN0cyB1c2luZyBtb3JlIGVsYWJvcmF0ZSBwYXR0ZXJzCi0jICAgICB3b3VsZCBhbHNvIGJlIGludGVyZXN0aW5nLiAgWW91ciBjb2RlIHNob3VsZCBub3QgYnJlYWsgaWYgZ2l2ZW4gaHVuZHJlZHMKLSMgICAgIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgb3IgYmluYXJ5IGZpbGVzIHRvIHNjYW4uCi0KLSMgVGhpcyBpbXBsZW1lbnRhdGlvbjoKLSMgLSBjb21iaW5lcyBhbGwgcGF0dGVybnMgaW50byBhIHNpbmdsZSBvbmUgdXNpbmcgKCAuLi4gfCAuLi4gfCAuLi4gKQotIyAtIHJlYWRzIHBhdHRlcm5zIGZyb20gc3RkaW4sIHNjYW5zIGZpbGVzIGdpdmVuIGFzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKLSMgLSBwcm9kdWNlcyBvdXRwdXQgaW4gdGhlIGZvcm1hdCA8ZmlsZT46PGxpbmVubz46PGxpbmU+Ci0jIC0gaXMgb25seSBhYm91dCAyLjUgdGltZXMgYXMgc2xvdyBhcyBlZ3JlcCAodGhvdWdoIEkgY291bGRuJ3QgcnVuCi0jICAgVG9tJ3MgdGVzdCAtLSB0aGlzIHN5c3RlbSwgYSB2YW5pbGxhIFNHSSwgb25seSBoYXMgL2V0Yy90ZXJtaW5mbykKLQotaW1wb3J0IHN0cmluZwotaW1wb3J0IHN5cwotaW1wb3J0IHJlCi0KLWRlZiBtYWluKCk6Ci0gICAgcGF0cyA9IGxpc3QobWFwKGNob21wLCBzeXMuc3RkaW4ucmVhZGxpbmVzKCkpKQotICAgIGJpZ3BhdCA9ICcoJyArICd8Jy5qb2luKHBhdHMpICsgJyknCi0gICAgcHJvZyA9IHJlLmNvbXBpbGUoYmlncGF0KQotCi0gICAgZm9yIGZpbGUgaW4gc3lzLmFyZ3ZbMTpdOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmcCA9IG9wZW4oZmlsZSwgJ3InKQotICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBtc2c6Ci0gICAgICAgICAgICBwcmludCgiJXM6ICVzIiAlIChmaWxlLCBtc2cpKQotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgbGluZW5vID0gMAotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKLSAgICAgICAgICAgIGlmIG5vdCBsaW5lOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBsaW5lbm8gPSBsaW5lbm8gKyAxCi0gICAgICAgICAgICBpZiBwcm9nLnNlYXJjaChsaW5lKToKLSAgICAgICAgICAgICAgICBwcmludCgiJXM6JXM6JXMiICUgKGZpbGUsIGxpbmVubywgbGluZSksIGVuZD0nICcpCi0KLWRlZiBjaG9tcChzKToKLSAgICByZXR1cm4gcy5yc3RyaXAoJ1xuJykKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0RlbW8vY29tcGFyaXNvbnMvc29ydGluZ3Rlc3QucHkgYi9EZW1vL2NvbXBhcmlzb25zL3NvcnRpbmd0ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlODI2ZTgxLi4wMDAwMDAwCi0tLSBhL0RlbW8vY29tcGFyaXNvbnMvc29ydGluZ3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uMwotCi0jIDIpICBTb3J0aW5nIFRlc3QKLSMKLSMgICAgIFNvcnQgYW4gaW5wdXQgZmlsZSB0aGF0IGNvbnNpc3RzIG9mIGxpbmVzIGxpa2UgdGhpcwotIwotIyAgICAgICAgIHZhcjE9MjMgb3RoZXI9MTQgZGl0dG89MjMgZnJlZD0yCi0jCi0jICAgICBzdWNoIHRoYXQgZWFjaCBvdXRwdXQgbGluZSBpcyBzb3J0ZWQgV1JUIHRvIHRoZSBudW1iZXIuICBPcmRlcgotIyAgICAgb2Ygb3V0cHV0IGxpbmVzIGRvZXMgbm90IGNoYW5nZS4gIFJlc29sdmUgY29sbGlzaW9ucyB1c2luZyB0aGUKLSMgICAgIHZhcmlhYmxlIG5hbWUuICAgZS5nLgotIwotIyAgICAgICAgIGZyZWQ9MiBvdGhlcj0xNCBkaXR0bz0yMyB2YXIxPTIzCi0jCi0jICAgICBMaW5lcyBtYXkgYmUgdXAgdG8gc2V2ZXJhbCBraWxvYnl0ZXMgaW4gbGVuZ3RoIGFuZCBjb250YWluCi0jICAgICB6aWxsaW9ucyBvZiB2YXJpYWJsZXMuCi0KLSMgVGhpcyBpbXBsZW1lbnRhdGlvbjoKLSMgLSBSZWFkcyBzdGRpbiwgd3JpdGVzIHN0ZG91dAotIyAtIFVzZXMgYW55IGFtb3VudCBvZiB3aGl0ZXNwYWNlIHRvIHNlcGFyYXRlIGZpZWxkcwotIyAtIEFsbG93cyBzaWduZWQgbnVtYmVycwotIyAtIFRyZWF0cyBpbGxlZ2FsbHkgZm9ybWF0dGVkIGZpZWxkcyBhcyBmaWVsZD0wCi0jIC0gT3V0cHV0cyB0aGUgc29ydGVkIGZpZWxkcyB3aXRoIGV4YWN0bHkgb25lIHNwYWNlIGJldHdlZW4gdGhlbQotIyAtIEhhbmRsZXMgYmxhbmsgaW5wdXQgbGluZXMgY29ycmVjdGx5Ci0KLWltcG9ydCByZQotaW1wb3J0IHN5cwotCi1kZWYgbWFpbigpOgotICAgIHByb2cgPSByZS5jb21waWxlKCdeKC4qKT0oWy0rXT9bMC05XSspJykKLSAgICBkZWYgbWFrZWtleShpdGVtLCBwcm9nPXByb2cpOgotICAgICAgICBtYXRjaCA9IHByb2cubWF0Y2goaXRlbSkKLSAgICAgICAgaWYgbWF0Y2g6Ci0gICAgICAgICAgICB2YXIsIG51bSA9IG1hdGNoLmdyb3VwcygpCi0gICAgICAgICAgICByZXR1cm4gaW50KG51bSksIHZhcgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBCYWQgaW5wdXQgLS0gcHJldGVuZCBpdCdzIGEgdmFyIHdpdGggdmFsdWUgMAotICAgICAgICAgICAgcmV0dXJuIDAsIGl0ZW0KLSAgICBmb3IgbGluZSBpbiBzeXMuc3RkaW46Ci0gICAgICAgIGl0ZW1zID0gc29ydGVkKG1ha2VrZXkoaXRlbSkgZm9yIGl0ZW0gaW4gbGluZS5zcGxpdCgpKQotICAgICAgICBmb3IgbnVtLCB2YXIgaW4gaXRlbXM6Ci0gICAgICAgICAgICBwcmludCgiJXM9JXMiICUgKHZhciwgbnVtKSwgZW5kPScgJykKLSAgICAgICAgcHJpbnQoKQotCi1tYWluKCkKZGlmZiAtLWdpdCBhL0RlbW8vY29tcGFyaXNvbnMvc3lzdGVtdGVzdC5weSBiL0RlbW8vY29tcGFyaXNvbnMvc3lzdGVtdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODI3NjMzMy4uMDAwMDAwMAotLS0gYS9EZW1vL2NvbXBhcmlzb25zL3N5c3RlbXRlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uMwotCi0jIDMpICBTeXN0ZW0gVGVzdAotIwotIyAgICAgR2l2ZW4gYSBsaXN0IG9mIGRpcmVjdG9yaWVzLCByZXBvcnQgYW55IGJvZ3VzIHN5bWJvbGljIGxpbmtzIGNvbnRhaW5lZAotIyAgICAgYW55d2hlcmUgaW4gdGhvc2Ugc3VidHJlZXMuICBBIGJvZ3VzIHN5bWJvbGljIGxpbmsgaXMgb25lIHRoYXQgY2Fubm90Ci0jICAgICBiZSByZXNvbHZlZCBiZWNhdXNlIGl0IHBvaW50cyB0byBhIG5vbmV4aXN0ZW50IG9yIG90aGVyd2lzZQotIyAgICAgdW5yZXNvbHZhYmxlIGZpbGUuICBEbyAqbm90KiB1c2UgYW4gZXh0ZXJuYWwgZmluZCBleGVjdXRhYmxlLgotIyAgICAgRGlyZWN0b3JpZXMgbWF5IGJlIHZlcnkgdmVyeSBkZWVwLiAgUHJpbnQgYSB3YXJuaW5nIGltbWVkaWF0ZWx5IGlmIHRoZQotIyAgICAgc3lzdGVtIHlvdSdyZSBydW5uaW5nIG9uIGRvZXNuJ3Qgc3VwcG9ydCBzeW1ib2xpYyBsaW5rcy4KLQotIyBUaGlzIGltcGxlbWVudGF0aW9uOgotIyAtIHRha2VzIG9uZSBvcHRpb25hbCBhcmd1bWVudCwgdXNpbmcgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFzIGRlZmF1bHQKLSMgLSB1c2VzIGNoZGlyIHRvIGluY3JlYXNlIHBlcmZvcm1hbmNlCi0jIC0gc29ydHMgdGhlIG5hbWVzIHBlciBkaXJlY3RvcnkKLSMgLSBwcmludHMgb3V0cHV0IGxpbmVzIG9mIHRoZSBmb3JtICJwYXRoMSAtPiBwYXRoMiIgYXMgaXQgZ29lcwotIyAtIHByaW50cyBlcnJvciBtZXNzYWdlcyBhYm91dCBkaXJlY3RvcmllcyBpdCBjYW4ndCBsaXN0IG9yIGNoZGlyIGludG8KLQotaW1wb3J0IG9zCi1pbXBvcnQgc3lzCi1mcm9tIHN0YXQgaW1wb3J0ICoKLQotZGVmIG1haW4oKToKLSAgICB0cnk6Ci0gICAgICAgICMgTm90ZTogY2FuJ3QgdGVzdCBmb3IgcHJlc2VuY2Ugb2YgbHN0YXQgLS0gaXQncyBhbHdheXMgdGhlcmUKLSAgICAgICAgZHVtbXkgPSBvcy5yZWFkbGluawotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgcHJpbnQoIlRoaXMgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBzeW1ib2xpYyBsaW5rcyIpCi0gICAgICAgIHN5cy5leGl0KDApCi0gICAgaWYgc3lzLmFyZ3ZbMTpdOgotICAgICAgICBwcmVmaXggPSBzeXMuYXJndlsxXQotICAgIGVsc2U6Ci0gICAgICAgIHByZWZpeCA9ICcnCi0gICAgaWYgcHJlZml4OgotICAgICAgICBvcy5jaGRpcihwcmVmaXgpCi0gICAgICAgIGlmIHByZWZpeFstMTpdICE9ICcvJzogcHJlZml4ID0gcHJlZml4ICsgJy8nCi0gICAgICAgIHJlcG9ydGJvZ3VzbGlua3MocHJlZml4KQotICAgIGVsc2U6Ci0gICAgICAgIHJlcG9ydGJvZ3VzbGlua3MoJycpCi0KLWRlZiByZXBvcnRib2d1c2xpbmtzKHByZWZpeCk6Ci0gICAgdHJ5OgotICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoJy4nKQotICAgIGV4Y2VwdCBvcy5lcnJvciBhcyBtc2c6Ci0gICAgICAgIHByaW50KCIlcyVzOiBjYW4ndCBsaXN0OiAlcyIgJSAocHJlZml4LCAnLicsIG1zZykpCi0gICAgICAgIHJldHVybgotICAgIG5hbWVzLnNvcnQoKQotICAgIGZvciBuYW1lIGluIG5hbWVzOgotICAgICAgICBpZiBuYW1lID09IG9zLmN1cmRpciBvciBuYW1lID09IG9zLnBhcmRpcjoKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG1vZGUgPSBvcy5sc3RhdChuYW1lKVtTVF9NT0RFXQotICAgICAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgICAgICBwcmludCgiJXMlczogY2FuJ3Qgc3RhdDogJXMiICUgKHByZWZpeCwgbmFtZSwgbXNnKSkKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGlmIFNfSVNMTksobW9kZSk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb3Muc3RhdChuYW1lKQotICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgotICAgICAgICAgICAgICAgIHByaW50KCIlcyVzIC0+ICVzIiAlIFwKLSAgICAgICAgICAgICAgICAgICAgICAocHJlZml4LCBuYW1lLCBvcy5yZWFkbGluayhuYW1lKSkpCi0gICAgICAgIGVsaWYgU19JU0RJUihtb2RlKToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBvcy5jaGRpcihuYW1lKQotICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yIGFzIG1zZzoKLSAgICAgICAgICAgICAgICBwcmludCgiJXMlczogY2FuJ3QgY2hkaXI6ICVzIiAlIFwKLSAgICAgICAgICAgICAgICAgICAgICAocHJlZml4LCBuYW1lLCBtc2cpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmVwb3J0Ym9ndXNsaW5rcyhwcmVmaXggKyBuYW1lICsgJy8nKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBvcy5jaGRpcignLi4nKQotCi1tYWluKCkKZGlmZiAtLWdpdCBhL0RlbW8vY3Vyc2VzL25jdXJzZXMucHkgYi9EZW1vL2N1cnNlcy9uY3Vyc2VzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWRkZTI5Li4wMDAwMDAwCi0tLSBhL0RlbW8vY3Vyc2VzL25jdXJzZXMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAkSWQkCi0jCi0jIChuKWN1cnNlcyBleGVyY2lzZXIgaW4gUHl0aG9uLCBhbiBpbnRlcmFjdGl2ZSB0ZXN0IGZvciB0aGUgY3Vyc2VzCi0jIG1vZHVsZS4gQ3VycmVudGx5LCBvbmx5IHRoZSBwYW5lbCBkZW1vcyBhcmUgcG9ydGVkLgotCi1pbXBvcnQgY3Vyc2VzCi1mcm9tIGN1cnNlcyBpbXBvcnQgcGFuZWwKLQotZGVmIHdHZXRjaGFyKHdpbiA9IE5vbmUpOgotICAgIGlmIHdpbiBpcyBOb25lOiB3aW4gPSBzdGRzY3IKLSAgICByZXR1cm4gd2luLmdldGNoKCkKLQotZGVmIEdldGNoYXIoKToKLSAgICB3R2V0Y2hhcigpCi0KLSMKLSMgUGFuZWxzIHRlc3RlcgotIwotZGVmIHdhaXRfYV93aGlsZSgpOgotICAgIGlmIG5hcF9tc2VjID09IDE6Ci0gICAgICAgIEdldGNoYXIoKQotICAgIGVsc2U6Ci0gICAgICAgIGN1cnNlcy5uYXBtcyhuYXBfbXNlYykKLQotZGVmIHNheXdoYXQodGV4dCk6Ci0gICAgc3Rkc2NyLm1vdmUoY3Vyc2VzLkxJTkVTIC0gMSwgMCkKLSAgICBzdGRzY3IuY2xydG9lb2woKQotICAgIHN0ZHNjci5hZGRzdHIodGV4dCkKLQotZGVmIG1rcGFuZWwoY29sb3IsIHJvd3MsIGNvbHMsIHRseSwgdGx4KToKLSAgICB3aW4gPSBjdXJzZXMubmV3d2luKHJvd3MsIGNvbHMsIHRseSwgdGx4KQotICAgIHBhbiA9IHBhbmVsLm5ld19wYW5lbCh3aW4pCi0gICAgaWYgY3Vyc2VzLmhhc19jb2xvcnMoKToKLSAgICAgICAgaWYgY29sb3IgPT0gY3Vyc2VzLkNPTE9SX0JMVUU6Ci0gICAgICAgICAgICBmZyA9IGN1cnNlcy5DT0xPUl9XSElURQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgZmcgPSBjdXJzZXMuQ09MT1JfQkxBQ0sKLSAgICAgICAgYmcgPSBjb2xvcgotICAgICAgICBjdXJzZXMuaW5pdF9wYWlyKGNvbG9yLCBmZywgYmcpCi0gICAgICAgIHdpbi5ia2dkc2V0KG9yZCgnICcpLCBjdXJzZXMuY29sb3JfcGFpcihjb2xvcikpCi0gICAgZWxzZToKLSAgICAgICAgd2luLmJrZ2RzZXQob3JkKCcgJyksIGN1cnNlcy5BX0JPTEQpCi0KLSAgICByZXR1cm4gcGFuCi0KLWRlZiBwZmx1c2goKToKLSAgICBwYW5lbC51cGRhdGVfcGFuZWxzKCkKLSAgICBjdXJzZXMuZG91cGRhdGUoKQotCi1kZWYgZmlsbF9wYW5lbChwYW4pOgotICAgIHdpbiA9IHBhbi53aW5kb3coKQotICAgIG51bSA9IHBhbi51c2VycHRyKClbMV0KLQotICAgIHdpbi5tb3ZlKDEsIDEpCi0gICAgd2luLmFkZHN0cigiLXBhbiVjLSIgJSBudW0pCi0gICAgd2luLmNscnRvZW9sKCkKLSAgICB3aW4uYm94KCkKLQotICAgIG1heHksIG1heHggPSB3aW4uZ2V0bWF4eXgoKQotICAgIGZvciB5IGluIHJhbmdlKDIsIG1heHkgLSAxKToKLSAgICAgICAgZm9yIHggaW4gcmFuZ2UoMSwgbWF4eCAtIDEpOgotICAgICAgICAgICAgd2luLm1vdmUoeSwgeCkKLSAgICAgICAgICAgIHdpbi5hZGRjaChudW0pCi0KLWRlZiBkZW1vX3BhbmVscyh3aW4pOgotICAgIGdsb2JhbCBzdGRzY3IsIG5hcF9tc2VjLCBtb2QKLSAgICBzdGRzY3IgPSB3aW4KLSAgICBuYXBfbXNlYyA9IDEKLSAgICBtb2QgPSBbInRlc3QiLCAiVEVTVCIsICIoKiopIiwgIiooKSoiLCAiPC0tPiIsICJMQVNUIl0KLQotICAgIHN0ZHNjci5yZWZyZXNoKCkKLQotICAgIGZvciB5IGluIHJhbmdlKDAsIGN1cnNlcy5MSU5FUyAtIDEpOgotICAgICAgICBmb3IgeCBpbiByYW5nZSgwLCBjdXJzZXMuQ09MUyk6Ci0gICAgICAgICAgICBzdGRzY3IuYWRkc3RyKCIlZCIgJSAoKHkgKyB4KSAlIDEwKSkKLSAgICBmb3IgeSBpbiByYW5nZSgwLCAxKToKLSAgICAgICAgcDEgPSBta3BhbmVsKGN1cnNlcy5DT0xPUl9SRUQsCi0gICAgICAgICAgICAgICAgICAgICBjdXJzZXMuTElORVMgLy8gMiAtIDIsCi0gICAgICAgICAgICAgICAgICAgICBjdXJzZXMuQ09MUyAvLyA4ICsgMSwKLSAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAwKQotICAgICAgICBwMS5zZXRfdXNlcnB0cigicDEiKQotCi0gICAgICAgIHAyID0gbWtwYW5lbChjdXJzZXMuQ09MT1JfR1JFRU4sCi0gICAgICAgICAgICAgICAgICAgICBjdXJzZXMuTElORVMgLy8gMiArIDEsCi0gICAgICAgICAgICAgICAgICAgICBjdXJzZXMuQ09MUyAvLyA3LAotICAgICAgICAgICAgICAgICAgICAgY3Vyc2VzLkxJTkVTIC8vIDQsCi0gICAgICAgICAgICAgICAgICAgICBjdXJzZXMuQ09MUyAvLyAxMCkKLSAgICAgICAgcDIuc2V0X3VzZXJwdHIoInAyIikKLQotICAgICAgICBwMyA9IG1rcGFuZWwoY3Vyc2VzLkNPTE9SX1lFTExPVywKLSAgICAgICAgICAgICAgICAgICAgIGN1cnNlcy5MSU5FUyAvLyA0LAotICAgICAgICAgICAgICAgICAgICAgY3Vyc2VzLkNPTFMgLy8gMTAsCi0gICAgICAgICAgICAgICAgICAgICBjdXJzZXMuTElORVMgLy8gMiwKLSAgICAgICAgICAgICAgICAgICAgIGN1cnNlcy5DT0xTIC8vIDkpCi0gICAgICAgIHAzLnNldF91c2VycHRyKCJwMyIpCi0KLSAgICAgICAgcDQgPSBta3BhbmVsKGN1cnNlcy5DT0xPUl9CTFVFLAotICAgICAgICAgICAgICAgICAgICAgY3Vyc2VzLkxJTkVTIC8vIDIgLSAyLAotICAgICAgICAgICAgICAgICAgICAgY3Vyc2VzLkNPTFMgLy8gOCwKLSAgICAgICAgICAgICAgICAgICAgIGN1cnNlcy5MSU5FUyAvLyAyIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgIGN1cnNlcy5DT0xTIC8vIDMpCi0gICAgICAgIHA0LnNldF91c2VycHRyKCJwNCIpCi0KLSAgICAgICAgcDUgPSBta3BhbmVsKGN1cnNlcy5DT0xPUl9NQUdFTlRBLAotICAgICAgICAgICAgICAgICAgICAgY3Vyc2VzLkxJTkVTIC8vIDIgLSAyLAotICAgICAgICAgICAgICAgICAgICAgY3Vyc2VzLkNPTFMgLy8gOCwKLSAgICAgICAgICAgICAgICAgICAgIGN1cnNlcy5MSU5FUyAvLyAyLAotICAgICAgICAgICAgICAgICAgICAgY3Vyc2VzLkNPTFMgLy8gMiAtIDIpCi0gICAgICAgIHA1LnNldF91c2VycHRyKCJwNSIpCi0KLSAgICAgICAgZmlsbF9wYW5lbChwMSkKLSAgICAgICAgZmlsbF9wYW5lbChwMikKLSAgICAgICAgZmlsbF9wYW5lbChwMykKLSAgICAgICAgZmlsbF9wYW5lbChwNCkKLSAgICAgICAgZmlsbF9wYW5lbChwNSkKLSAgICAgICAgcDQuaGlkZSgpCi0gICAgICAgIHA1LmhpZGUoKQotICAgICAgICBwZmx1c2goKQotICAgICAgICBzYXl3aGF0KCJwcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlIikKLSAgICAgICAgd2FpdF9hX3doaWxlKCkKLQotICAgICAgICBzYXl3aGF0KCJoMyBzMSBzMiBzNCBzNTtwcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlIikKLSAgICAgICAgcDEubW92ZSgwLCAwKQotICAgICAgICBwMy5oaWRlKCkKLSAgICAgICAgcDEuc2hvdygpCi0gICAgICAgIHAyLnNob3coKQotICAgICAgICBwNC5zaG93KCkKLSAgICAgICAgcDUuc2hvdygpCi0gICAgICAgIHBmbHVzaCgpCi0gICAgICAgIHdhaXRfYV93aGlsZSgpCi0KLSAgICAgICAgc2F5d2hhdCgiczE7IHByZXNzIGFueSBrZXkgdG8gY29udGludWUiKQotICAgICAgICBwMS5zaG93KCkKLSAgICAgICAgcGZsdXNoKCkKLSAgICAgICAgd2FpdF9hX3doaWxlKCkKLQotICAgICAgICBzYXl3aGF0KCJzMjsgcHJlc3MgYW55IGtleSB0byBjb250aW51ZSIpCi0gICAgICAgIHAyLnNob3coKQotICAgICAgICBwZmx1c2goKQotICAgICAgICB3YWl0X2Ffd2hpbGUoKQotCi0gICAgICAgIHNheXdoYXQoIm0yOyBwcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlIikKLSAgICAgICAgcDIubW92ZShjdXJzZXMuTElORVMgLy8gMyArIDEsIGN1cnNlcy5DT0xTIC8vIDgpCi0gICAgICAgIHBmbHVzaCgpCi0gICAgICAgIHdhaXRfYV93aGlsZSgpCi0KLSAgICAgICAgc2F5d2hhdCgiczM7IHByZXNzIGFueSBrZXkgdG8gY29udGludWUiKQotICAgICAgICBwMy5zaG93KCkKLSAgICAgICAgcGZsdXNoKCkKLSAgICAgICAgd2FpdF9hX3doaWxlKCkKLQotICAgICAgICBzYXl3aGF0KCJtMzsgcHJlc3MgYW55IGtleSB0byBjb250aW51ZSIpCi0gICAgICAgIHAzLm1vdmUoY3Vyc2VzLkxJTkVTIC8vIDQgKyAxLCBjdXJzZXMuQ09MUyAvLyAxNSkKLSAgICAgICAgcGZsdXNoKCkKLSAgICAgICAgd2FpdF9hX3doaWxlKCkKLQotICAgICAgICBzYXl3aGF0KCJiMzsgcHJlc3MgYW55IGtleSB0byBjb250aW51ZSIpCi0gICAgICAgIHAzLmJvdHRvbSgpCi0gICAgICAgIHBmbHVzaCgpCi0gICAgICAgIHdhaXRfYV93aGlsZSgpCi0KLSAgICAgICAgc2F5d2hhdCgiczQ7IHByZXNzIGFueSBrZXkgdG8gY29udGludWUiKQotICAgICAgICBwNC5zaG93KCkKLSAgICAgICAgcGZsdXNoKCkKLSAgICAgICAgd2FpdF9hX3doaWxlKCkKLQotICAgICAgICBzYXl3aGF0KCJzNTsgcHJlc3MgYW55IGtleSB0byBjb250aW51ZSIpCi0gICAgICAgIHA1LnNob3coKQotICAgICAgICBwZmx1c2goKQotICAgICAgICB3YWl0X2Ffd2hpbGUoKQotCi0gICAgICAgIHNheXdoYXQoInQzOyBwcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlIikKLSAgICAgICAgcDMudG9wKCkKLSAgICAgICAgcGZsdXNoKCkKLSAgICAgICAgd2FpdF9hX3doaWxlKCkKLQotICAgICAgICBzYXl3aGF0KCJ0MTsgcHJlc3MgYW55IGtleSB0byBjb250aW51ZSIpCi0gICAgICAgIHAxLnNob3coKQotICAgICAgICBwZmx1c2goKQotICAgICAgICB3YWl0X2Ffd2hpbGUoKQotCi0gICAgICAgIHNheXdoYXQoInQyOyBwcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlIikKLSAgICAgICAgcDIuc2hvdygpCi0gICAgICAgIHBmbHVzaCgpCi0gICAgICAgIHdhaXRfYV93aGlsZSgpCi0KLSAgICAgICAgc2F5d2hhdCgidDM7IHByZXNzIGFueSBrZXkgdG8gY29udGludWUiKQotICAgICAgICBwMy5zaG93KCkKLSAgICAgICAgcGZsdXNoKCkKLSAgICAgICAgd2FpdF9hX3doaWxlKCkKLQotICAgICAgICBzYXl3aGF0KCJ0NDsgcHJlc3MgYW55IGtleSB0byBjb250aW51ZSIpCi0gICAgICAgIHA0LnNob3coKQotICAgICAgICBwZmx1c2goKQotICAgICAgICB3YWl0X2Ffd2hpbGUoKQotCi0gICAgICAgIGZvciBpdG1wIGluIHJhbmdlKDAsIDYpOgotICAgICAgICAgICAgdzQgPSBwNC53aW5kb3coKQotICAgICAgICAgICAgdzUgPSBwNS53aW5kb3coKQotCi0gICAgICAgICAgICBzYXl3aGF0KCJtNDsgcHJlc3MgYW55IGtleSB0byBjb250aW51ZSIpCi0gICAgICAgICAgICB3NC5tb3ZlKGN1cnNlcy5MSU5FUyAvLyA4LCAxKQotICAgICAgICAgICAgdzQuYWRkc3RyKG1vZFtpdG1wXSkKLSAgICAgICAgICAgIHA0Lm1vdmUoY3Vyc2VzLkxJTkVTIC8vIDYsIGl0bXAgKiBjdXJzZXMuQ09MUyAvLyA4KQotICAgICAgICAgICAgdzUubW92ZShjdXJzZXMuTElORVMgLy8gNiwgMSkKLSAgICAgICAgICAgIHc1LmFkZHN0cihtb2RbaXRtcF0pCi0gICAgICAgICAgICBwZmx1c2goKQotICAgICAgICAgICAgd2FpdF9hX3doaWxlKCkKLQotICAgICAgICAgICAgc2F5d2hhdCgibTU7IHByZXNzIGFueSBrZXkgdG8gY29udGludWUiKQotICAgICAgICAgICAgdzQubW92ZShjdXJzZXMuTElORVMgLy8gNiwgMSkKLSAgICAgICAgICAgIHc0LmFkZHN0cihtb2RbaXRtcF0pCi0gICAgICAgICAgICBwNS5tb3ZlKGN1cnNlcy5MSU5FUyAvLyAzIC0gMSwgaXRtcCAqIDEwICsgNikKLSAgICAgICAgICAgIHc1Lm1vdmUoY3Vyc2VzLkxJTkVTIC8vIDgsIDEpCi0gICAgICAgICAgICB3NS5hZGRzdHIobW9kW2l0bXBdKQotICAgICAgICAgICAgcGZsdXNoKCkKLSAgICAgICAgICAgIHdhaXRfYV93aGlsZSgpCi0KLSAgICAgICAgc2F5d2hhdCgibTQ7IHByZXNzIGFueSBrZXkgdG8gY29udGludWUiKQotICAgICAgICBwNC5tb3ZlKGN1cnNlcy5MSU5FUyAvLyA2LCAoaXRtcCArIDEpICogY3Vyc2VzLkNPTFMgLy8gOCkKLSAgICAgICAgcGZsdXNoKCkKLSAgICAgICAgd2FpdF9hX3doaWxlKCkKLQotICAgICAgICBzYXl3aGF0KCJ0NTsgcHJlc3MgYW55IGtleSB0byBjb250aW51ZSIpCi0gICAgICAgIHA1LnRvcCgpCi0gICAgICAgIHBmbHVzaCgpCi0gICAgICAgIHdhaXRfYV93aGlsZSgpCi0KLSAgICAgICAgc2F5d2hhdCgidDI7IHByZXNzIGFueSBrZXkgdG8gY29udGludWUiKQotICAgICAgICBwMi50b3AoKQotICAgICAgICBwZmx1c2goKQotICAgICAgICB3YWl0X2Ffd2hpbGUoKQotCi0gICAgICAgIHNheXdoYXQoInQxOyBwcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlIikKLSAgICAgICAgcDEudG9wKCkKLSAgICAgICAgcGZsdXNoKCkKLSAgICAgICAgd2FpdF9hX3doaWxlKCkKLQotICAgICAgICBzYXl3aGF0KCJkMjsgcHJlc3MgYW55IGtleSB0byBjb250aW51ZSIpCi0gICAgICAgIGRlbCBwMgotICAgICAgICBwZmx1c2goKQotICAgICAgICB3YWl0X2Ffd2hpbGUoKQotCi0gICAgICAgIHNheXdoYXQoImgzOyBwcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlIikKLSAgICAgICAgcDMuaGlkZSgpCi0gICAgICAgIHBmbHVzaCgpCi0gICAgICAgIHdhaXRfYV93aGlsZSgpCi0KLSAgICAgICAgc2F5d2hhdCgiZDE7IHByZXNzIGFueSBrZXkgdG8gY29udGludWUiKQotICAgICAgICBkZWwgcDEKLSAgICAgICAgcGZsdXNoKCkKLSAgICAgICAgd2FpdF9hX3doaWxlKCkKLQotICAgICAgICBzYXl3aGF0KCJkNDsgcHJlc3MgYW55IGtleSB0byBjb250aW51ZSIpCi0gICAgICAgIGRlbCBwNAotICAgICAgICBwZmx1c2goKQotICAgICAgICB3YWl0X2Ffd2hpbGUoKQotCi0gICAgICAgIHNheXdoYXQoImQ1OyBwcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlIikKLSAgICAgICAgZGVsIHA1Ci0gICAgICAgIHBmbHVzaCgpCi0gICAgICAgIHdhaXRfYV93aGlsZSgpCi0gICAgICAgIGlmIG5hcF9tc2VjID09IDE6Ci0gICAgICAgICAgICBicmVhawotICAgICAgICBuYXBfbXNlYyA9IDEwMAotCi0jCi0jIG9uZSBmaW5lIGRheSB0aGVyZSdsbCBiZSB0aGUgbWVudSBhdCB0aGlzIHBsYWNlCi0jCi1jdXJzZXMud3JhcHBlcihkZW1vX3BhbmVscykKZGlmZiAtLWdpdCBhL0RlbW8vY3Vyc2VzL3JhaW4ucHkgYi9EZW1vL2N1cnNlcy9yYWluLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2FiYjRmLi4wMDAwMDAwCi0tLSBhL0RlbW8vY3Vyc2VzL3JhaW4ucHkKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24zCi0jCi0jICRJZCQKLSMKLSMgc29tZWJvZHkgc2hvdWxkIHByb2JhYmx5IGNoZWNrIHRoZSByYW5kcmFuZ2UoKXMuLi4KLQotaW1wb3J0IGN1cnNlcwotZnJvbSByYW5kb20gaW1wb3J0IHJhbmRyYW5nZQotCi1kZWYgbmV4dF9qKGopOgotICAgIGlmIGogPT0gMDoKLSAgICAgICAgaiA9IDQKLSAgICBlbHNlOgotICAgICAgICBqIC09IDEKLQotICAgIGlmIGN1cnNlcy5oYXNfY29sb3JzKCk6Ci0gICAgICAgIHogPSByYW5kcmFuZ2UoMCwgMykKLSAgICAgICAgY29sb3IgPSBjdXJzZXMuY29sb3JfcGFpcih6KQotICAgICAgICBpZiB6OgotICAgICAgICAgICAgY29sb3IgPSBjb2xvciB8IGN1cnNlcy5BX0JPTEQKLSAgICAgICAgc3Rkc2NyLmF0dHJzZXQoY29sb3IpCi0KLSAgICByZXR1cm4gagotCi1kZWYgbWFpbih3aW4pOgotICAgICMgd2Uga25vdyB0aGF0IHRoZSBmaXJzdCBhcmd1bWVudCBmcm9tIGN1cnNlcy53cmFwcGVyKCkgaXMgc3Rkc2NyLgotICAgICMgSW5pdGlhbGl6ZSBpdCBnbG9iYWxseSBmb3IgY29udmVuaWVuY2UuCi0gICAgZ2xvYmFsIHN0ZHNjcgotICAgIHN0ZHNjciA9IHdpbgotCi0gICAgaWYgY3Vyc2VzLmhhc19jb2xvcnMoKToKLSAgICAgICAgYmcgPSBjdXJzZXMuQ09MT1JfQkxBQ0sKLSAgICAgICAgY3Vyc2VzLmluaXRfcGFpcigxLCBjdXJzZXMuQ09MT1JfQkxVRSwgYmcpCi0gICAgICAgIGN1cnNlcy5pbml0X3BhaXIoMiwgY3Vyc2VzLkNPTE9SX0NZQU4sIGJnKQotCi0gICAgY3Vyc2VzLm5sKCkKLSAgICBjdXJzZXMubm9lY2hvKCkKLSAgICAjIFhYWCBjdXJzX3NldCgpIGFsd2F5cyByZXR1cm5zIEVSUgotICAgICMgY3Vyc2VzLmN1cnNfc2V0KDApCi0gICAgc3Rkc2NyLnRpbWVvdXQoMCkKLQotICAgIGMgPSBjdXJzZXMuQ09MUyAtIDQKLSAgICByID0gY3Vyc2VzLkxJTkVTIC0gNAotICAgIHhwb3MgPSBbMF0gKiBjCi0gICAgeXBvcyA9IFswXSAqIHIKLSAgICBmb3IgaiBpbiByYW5nZSg0LCAtMSwgLTEpOgotICAgICAgICB4cG9zW2pdID0gcmFuZHJhbmdlKDAsIGMpICsgMgotICAgICAgICB5cG9zW2pdID0gcmFuZHJhbmdlKDAsIHIpICsgMgotCi0gICAgaiA9IDAKLSAgICB3aGlsZSBUcnVlOgotICAgICAgICB4ID0gcmFuZHJhbmdlKDAsIGMpICsgMgotICAgICAgICB5ID0gcmFuZHJhbmdlKDAsIHIpICsgMgotCi0gICAgICAgIHN0ZHNjci5hZGRjaCh5LCB4LCBvcmQoJy4nKSkKLQotICAgICAgICBzdGRzY3IuYWRkY2goeXBvc1tqXSwgeHBvc1tqXSwgb3JkKCdvJykpCi0KLSAgICAgICAgaiA9IG5leHRfaihqKQotICAgICAgICBzdGRzY3IuYWRkY2goeXBvc1tqXSwgeHBvc1tqXSwgb3JkKCdPJykpCi0KLSAgICAgICAgaiA9IG5leHRfaihqKQotICAgICAgICBzdGRzY3IuYWRkY2goIHlwb3Nbal0gLSAxLCB4cG9zW2pdLCAgICAgb3JkKCctJykpCi0gICAgICAgIHN0ZHNjci5hZGRzdHIoeXBvc1tqXSwgICAgIHhwb3Nbal0gLSAxLCAifC58IikKLSAgICAgICAgc3Rkc2NyLmFkZGNoKCB5cG9zW2pdICsgMSwgeHBvc1tqXSwgICAgIG9yZCgnLScpKQotCi0gICAgICAgIGogPSBuZXh0X2ooaikKLSAgICAgICAgc3Rkc2NyLmFkZGNoKCB5cG9zW2pdIC0gMiwgeHBvc1tqXSwgICAgIG9yZCgnLScpKQotICAgICAgICBzdGRzY3IuYWRkc3RyKHlwb3Nbal0gLSAxLCB4cG9zW2pdIC0gMSwgIi8gXFwiKQotICAgICAgICBzdGRzY3IuYWRkc3RyKHlwb3Nbal0sICAgICB4cG9zW2pdIC0gMiwgInwgTyB8IikKLSAgICAgICAgc3Rkc2NyLmFkZHN0cih5cG9zW2pdICsgMSwgeHBvc1tqXSAtIDEsICJcXCAvIikKLSAgICAgICAgc3Rkc2NyLmFkZGNoKCB5cG9zW2pdICsgMiwgeHBvc1tqXSwgICAgIG9yZCgnLScpKQotCi0gICAgICAgIGogPSBuZXh0X2ooaikKLSAgICAgICAgc3Rkc2NyLmFkZGNoKCB5cG9zW2pdIC0gMiwgeHBvc1tqXSwgICAgIG9yZCgnICcpKQotICAgICAgICBzdGRzY3IuYWRkc3RyKHlwb3Nbal0gLSAxLCB4cG9zW2pdIC0gMSwgIiAgICIpCi0gICAgICAgIHN0ZHNjci5hZGRzdHIoeXBvc1tqXSwgICAgIHhwb3Nbal0gLSAyLCAiICAgICAiKQotICAgICAgICBzdGRzY3IuYWRkc3RyKHlwb3Nbal0gKyAxLCB4cG9zW2pdIC0gMSwgIiAgICIpCi0gICAgICAgIHN0ZHNjci5hZGRjaCggeXBvc1tqXSArIDIsIHhwb3Nbal0sICAgICBvcmQoJyAnKSkKLQotICAgICAgICB4cG9zW2pdID0geAotICAgICAgICB5cG9zW2pdID0geQotCi0gICAgICAgIGNoID0gc3Rkc2NyLmdldGNoKCkKLSAgICAgICAgaWYgY2ggPT0gb3JkKCdxJykgb3IgY2ggPT0gb3JkKCdRJyk6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgZWxpZiBjaCA9PSBvcmQoJ3MnKToKLSAgICAgICAgICAgIHN0ZHNjci5ub2RlbGF5KDApCi0gICAgICAgIGVsaWYgY2ggPT0gb3JkKCcgJyk6Ci0gICAgICAgICAgICBzdGRzY3Iubm9kZWxheSgxKQotCi0gICAgICAgIGN1cnNlcy5uYXBtcyg1MCkKLQotY3Vyc2VzLndyYXBwZXIobWFpbikKZGlmZiAtLWdpdCBhL0RlbW8vY3Vyc2VzL3RjbG9jay5weSBiL0RlbW8vY3Vyc2VzL3RjbG9jay5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlMGE5My4uMDAwMDAwMAotLS0gYS9EZW1vL2N1cnNlcy90Y2xvY2sucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIwotIyAkSWQkCi0jCi0jIEZyb20gdGNsb2NrLmMsIENvcHlyaWdodCBIb3dhcmQgSm9uZXMgPGhhLmpvbmVzQGljLmFjLnVrPiwgU2VwdGVtYmVyIDE5OTQuCi0KLWZyb20gbWF0aCBpbXBvcnQgKgotaW1wb3J0IGN1cnNlcywgdGltZQotCi1BU1BFQ1QgPSAyLjIKLQotZGVmIHNpZ24oX3gpOgotICAgIGlmIF94IDwgMDogcmV0dXJuIC0xCi0gICAgcmV0dXJuIDEKLQotZGVmIEEyWFkoYW5nbGUsIHJhZGl1cyk6Ci0gICAgcmV0dXJuIChpbnQocm91bmQoQVNQRUNUICogcmFkaXVzICogc2luKGFuZ2xlKSkpLAotICAgICAgICAgICAgaW50KHJvdW5kKHJhZGl1cyAqIGNvcyhhbmdsZSkpKSkKLQotZGVmIHBsb3QoeCwgeSwgY29sKToKLSAgICBzdGRzY3IuYWRkY2goeSwgeCwgY29sKQotCi0jIGRyYXcgYSBkaWFnb25hbCBsaW5lIHVzaW5nIEJyZXNlbmhhbSdzIGFsZ29yaXRobQotZGVmIGRsaW5lKHBhaXIsIGZyb21feCwgZnJvbV95LCB4MiwgeTIsIGNoKToKLSAgICBpZiBjdXJzZXMuaGFzX2NvbG9ycygpOgotICAgICAgICBzdGRzY3IuYXR0cnNldChjdXJzZXMuY29sb3JfcGFpcihwYWlyKSkKLQotICAgIGR4ID0geDIgLSBmcm9tX3gKLSAgICBkeSA9IHkyIC0gZnJvbV95Ci0KLSAgICBheCA9IGFicyhkeCAqIDIpCi0gICAgYXkgPSBhYnMoZHkgKiAyKQotCi0gICAgc3ggPSBzaWduKGR4KQotICAgIHN5ID0gc2lnbihkeSkKLQotICAgIHggPSBmcm9tX3gKLSAgICB5ID0gZnJvbV95Ci0KLSAgICBpZiBheCA+IGF5OgotICAgICAgICBkID0gYXkgLSBheCAvLyAyCi0KLSAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIHBsb3QoeCwgeSwgY2gpCi0gICAgICAgICAgICBpZiB4ID09IHgyOgotICAgICAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgICAgICBpZiBkID49IDA6Ci0gICAgICAgICAgICAgICAgeSArPSBzeQotICAgICAgICAgICAgICAgIGQgLT0gYXgKLSAgICAgICAgICAgIHggKz0gc3gKLSAgICAgICAgICAgIGQgKz0gYXkKLSAgICBlbHNlOgotICAgICAgICBkID0gYXggLSBheSAvLyAyCi0KLSAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIHBsb3QoeCwgeSwgY2gpCi0gICAgICAgICAgICBpZiB5ID09IHkyOgotICAgICAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgICAgICBpZiBkID49IDA6Ci0gICAgICAgICAgICAgICAgeCArPSBzeAotICAgICAgICAgICAgICAgIGQgLT0gYXkKLSAgICAgICAgICAgIHkgKz0gc3kKLSAgICAgICAgICAgIGQgKz0gYXgKLQotZGVmIG1haW4od2luKToKLSAgICBnbG9iYWwgc3Rkc2NyCi0gICAgc3Rkc2NyID0gd2luCi0KLSAgICBsYXN0YmVlcCA9IC0xCi0gICAgbXlfYmcgPSBjdXJzZXMuQ09MT1JfQkxBQ0sKLQotICAgIHN0ZHNjci5ub2RlbGF5KDEpCi0gICAgc3Rkc2NyLnRpbWVvdXQoMCkKLSMgICAgY3Vyc2VzLmN1cnNfc2V0KDApCi0gICAgaWYgY3Vyc2VzLmhhc19jb2xvcnMoKToKLSAgICAgICAgY3Vyc2VzLmluaXRfcGFpcigxLCBjdXJzZXMuQ09MT1JfUkVELCBteV9iZykKLSAgICAgICAgY3Vyc2VzLmluaXRfcGFpcigyLCBjdXJzZXMuQ09MT1JfTUFHRU5UQSwgbXlfYmcpCi0gICAgICAgIGN1cnNlcy5pbml0X3BhaXIoMywgY3Vyc2VzLkNPTE9SX0dSRUVOLCBteV9iZykKLQotICAgIGN4ID0gKGN1cnNlcy5DT0xTIC0gMSkgLy8gMgotICAgIGN5ID0gY3Vyc2VzLkxJTkVTIC8vIDIKLSAgICBjaCA9IG1pbiggY3ktMSwgaW50KGN4IC8vIEFTUEVDVCkgLSAxKQotICAgIG1yYWRpdXMgPSAoMyAqIGNoKSAvLyA0Ci0gICAgaHJhZGl1cyA9IGNoIC8vIDIKLSAgICBzcmFkaXVzID0gNSAqIGNoIC8vIDYKLQotICAgIGZvciBpIGluIHJhbmdlKDAsIDEyKToKLSAgICAgICAgc2FuZ2xlID0gKGkgKyAxKSAqIDIuMCAqIHBpIC8gMTIuMAotICAgICAgICBzZHgsIHNkeSA9IEEyWFkoc2FuZ2xlLCBzcmFkaXVzKQotCi0gICAgICAgIHN0ZHNjci5hZGRzdHIoY3kgLSBzZHksIGN4ICsgc2R4LCAiJWQiICUgKGkgKyAxKSkKLQotICAgIHN0ZHNjci5hZGRzdHIoMCwgMCwKLSAgICAgICAgICAgICAgICAgICJBU0NJSSBDbG9jayBieSBIb3dhcmQgSm9uZXMgPGhhLmpvbmVzQGljLmFjLnVrPiwgMTk5NCIpCi0KLSAgICBzcmFkaXVzID0gbWF4KHNyYWRpdXMtNCwgOCkKLQotICAgIHdoaWxlIFRydWU6Ci0gICAgICAgIGN1cnNlcy5uYXBtcygxMDAwKQotCi0gICAgICAgIHRpbSA9IHRpbWUudGltZSgpCi0gICAgICAgIHQgPSB0aW1lLmxvY2FsdGltZSh0aW0pCi0KLSAgICAgICAgaG91cnMgPSB0WzNdICsgdFs0XSAvIDYwLjAKLSAgICAgICAgaWYgaG91cnMgPiAxMi4wOgotICAgICAgICAgICAgaG91cnMgLT0gMTIuMAotCi0gICAgICAgIG1hbmdsZSA9IHRbNF0gKiAyICogcGkgLyA2MC4wCi0gICAgICAgIG1keCwgbWR5ID0gQTJYWShtYW5nbGUsIG1yYWRpdXMpCi0KLSAgICAgICAgaGFuZ2xlID0gaG91cnMgKiAyICogcGkgLyAxMi4wCi0gICAgICAgIGhkeCwgaGR5ID0gQTJYWShoYW5nbGUsIGhyYWRpdXMpCi0KLSAgICAgICAgc2FuZ2xlID0gdFs1XSAqIDIgKiBwaSAvIDYwLjAKLSAgICAgICAgc2R4LCBzZHkgPSBBMlhZKHNhbmdsZSwgc3JhZGl1cykKLQotICAgICAgICBkbGluZSgzLCBjeCwgY3ksIGN4ICsgbWR4LCBjeSAtIG1keSwgb3JkKCcjJykpCi0KLSAgICAgICAgc3Rkc2NyLmF0dHJzZXQoY3Vyc2VzLkFfUkVWRVJTRSkKLSAgICAgICAgZGxpbmUoMiwgY3gsIGN5LCBjeCArIGhkeCwgY3kgLSBoZHksIG9yZCgnLicpKQotICAgICAgICBzdGRzY3IuYXR0cm9mZihjdXJzZXMuQV9SRVZFUlNFKQotCi0gICAgICAgIGlmIGN1cnNlcy5oYXNfY29sb3JzKCk6Ci0gICAgICAgICAgICBzdGRzY3IuYXR0cnNldChjdXJzZXMuY29sb3JfcGFpcigxKSkKLQotICAgICAgICBwbG90KGN4ICsgc2R4LCBjeSAtIHNkeSwgb3JkKCdPJykpCi0KLSAgICAgICAgaWYgY3Vyc2VzLmhhc19jb2xvcnMoKToKLSAgICAgICAgICAgIHN0ZHNjci5hdHRyc2V0KGN1cnNlcy5jb2xvcl9wYWlyKDApKQotCi0gICAgICAgIHN0ZHNjci5hZGRzdHIoY3Vyc2VzLkxJTkVTIC0gMiwgMCwgdGltZS5jdGltZSh0aW0pKQotICAgICAgICBzdGRzY3IucmVmcmVzaCgpCi0gICAgICAgIGlmICh0WzVdICUgNSkgPT0gMCBhbmQgdFs1XSAhPSBsYXN0YmVlcDoKLSAgICAgICAgICAgIGxhc3RiZWVwID0gdFs1XQotICAgICAgICAgICAgY3Vyc2VzLmJlZXAoKQotCi0gICAgICAgIGNoID0gc3Rkc2NyLmdldGNoKCkKLSAgICAgICAgaWYgY2ggPT0gb3JkKCdxJyk6Ci0gICAgICAgICAgICByZXR1cm4gMAotCi0gICAgICAgIHBsb3QoY3ggKyBzZHgsIGN5IC0gc2R5LCBvcmQoJyAnKSkKLSAgICAgICAgZGxpbmUoMCwgY3gsIGN5LCBjeCArIGhkeCwgY3kgLSBoZHksIG9yZCgnICcpKQotICAgICAgICBkbGluZSgwLCBjeCwgY3ksIGN4ICsgbWR4LCBjeSAtIG1keSwgb3JkKCcgJykpCi0KLWN1cnNlcy53cmFwcGVyKG1haW4pCmRpZmYgLS1naXQgYS9EZW1vL2N1cnNlcy94bWFzLnB5IGIvRGVtby9jdXJzZXMveG1hcy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5YjNhOC4uMDAwMDAwMAotLS0gYS9EZW1vL2N1cnNlcy94bWFzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOTA2ICswLDAgQEAKLSMgYXNjaWl4bWFzCi0jIERlY2VtYmVyIDE5ODkgICAgICAgICAgICAgTGFycnkgQmFydHogICAgICAgICAgIEluZGlhbmFwb2xpcywgSU4KLSMKLSMgJElkJAotIwotIyBJJ20gZHJlYW1pbmcgb2YgYW4gYXNjaWkgY2hhcmFjdGVyLWJhc2VkIG1vbm9jaHJvbWUgQ2hyaXN0bWFzLAotIyBKdXN0IGxpa2UgdGhlIG9uZXMgSSB1c2VkIHRvIGtub3chCi0jIFZpYSBhIGZ1bGwgZHVwbGV4IGNvbW11bmljYXRpb25zIGNoYW5uZWwsCi0jIEF0IDk2MDAgYml0cyBwZXIgc2Vjb25kLAotIyBFdmVuIHRob3VnaCBpdCdzIGtpbmRhIHNsb3cuCi0jCi0jIEknbSBkcmVhbWluZyBvZiBhbiBhc2NpaSBjaGFyYWN0ZXItYmFzZWQgbW9ub2Nocm9tZSBDaHJpc3RtYXMsCi0jIFdpdGggZXYncnkgQyBwcm9ncmFtIEkgd3JpdGUhCi0jIE1heSB5b3VyIHNjcmVlbiBiZSBtZXJyeSBhbmQgYnJpZ2h0IQotIyBBbmQgbWF5IGFsbCB5b3VyIENocmlzdG1hc2VzIGJlIGFtYmVyIG9yIGdyZWVuLAotIyAoZm9yIHJlZHVjZWQgZXllc3RyYWluIGFuZCBpbXByb3ZlZCB2aXNpYmlsaXR5KSEKLSMKLSMKLSMgTm90ZXMgb24gdGhlIFB5dGhvbiB2ZXJzaW9uOgotIyBJIHVzZWQgYSBjb3VwbGUgb2YgYHRyeS4uLmV4Y2VwdCBjdXJzZXMuZXJyb3InIHRvIGdldCBhcm91bmQgc29tZSBmdW5jdGlvbnMKLSMgcmV0dXJuaW5nIEVSUi4gVGhlIGVycm9ycyBjb21lIGZyb20gdXNpbmcgd3JhcHBpbmcgZnVuY3Rpb25zIHRvIGZpbGwKLSMgd2luZG93cyB0byB0aGUgbGFzdCBjaGFyYWN0ZXIgY2VsbC4gVGhlIEMgdmVyc2lvbiBkb2Vzbid0IGhhdmUgdGhpcyBwcm9ibGVtLAotIyBpdCBzaW1wbHkgaWdub3JlcyBhbnkgcmV0dXJuIHZhbHVlcy4KLSMKLQotaW1wb3J0IGN1cnNlcwotaW1wb3J0IHN5cwotCi1GUk9NV0hPID0gIlRob21hcyBHZWxsZWt1bSA8dGdARnJlZUJTRC5vcmc+IgotCi1kZWYgc2V0X2NvbG9yKHdpbiwgY29sb3IpOgotICAgIGlmIGN1cnNlcy5oYXNfY29sb3JzKCk6Ci0gICAgICAgIG4gPSBjb2xvciArIDEKLSAgICAgICAgY3Vyc2VzLmluaXRfcGFpcihuLCBjb2xvciwgbXlfYmcpCi0gICAgICAgIHdpbi5hdHRyb2ZmKGN1cnNlcy5BX0NPTE9SKQotICAgICAgICB3aW4uYXR0cm9uKGN1cnNlcy5jb2xvcl9wYWlyKG4pKQotCi1kZWYgdW5zZXRfY29sb3Iod2luKToKLSAgICBpZiBjdXJzZXMuaGFzX2NvbG9ycygpOgotICAgICAgICB3aW4uYXR0cnNldChjdXJzZXMuY29sb3JfcGFpcigwKSkKLQotZGVmIGxvb2tfb3V0KG1zZWNzKToKLSAgICBjdXJzZXMubmFwbXMobXNlY3MpCi0gICAgaWYgc3Rkc2NyLmdldGNoKCkgIT0gLTE6Ci0gICAgICAgIGN1cnNlcy5iZWVwKCkKLSAgICAgICAgc3lzLmV4aXQoMCkKLQotZGVmIGJveGl0KCk6Ci0gICAgZm9yIHkgaW4gcmFuZ2UoMCwgMjApOgotICAgICAgICBzdGRzY3IuYWRkY2goeSwgNywgb3JkKCd8JykpCi0KLSAgICBmb3IgeCBpbiByYW5nZSg4LCA4MCk6Ci0gICAgICAgIHN0ZHNjci5hZGRjaCgxOSwgeCwgb3JkKCdfJykpCi0KLSAgICBmb3IgeCBpbiByYW5nZSgwLCA4MCk6Ci0gICAgICAgIHN0ZHNjci5hZGRjaCgyMiwgeCwgb3JkKCdfJykpCi0KLSAgICByZXR1cm4KLQotZGVmIHNlYXMoKToKLSAgICBzdGRzY3IuYWRkY2goNCwgMSwgb3JkKCdTJykpCi0gICAgc3Rkc2NyLmFkZGNoKDYsIDEsIG9yZCgnRScpKQotICAgIHN0ZHNjci5hZGRjaCg4LCAxLCBvcmQoJ0EnKSkKLSAgICBzdGRzY3IuYWRkY2goMTAsIDEsIG9yZCgnUycpKQotICAgIHN0ZHNjci5hZGRjaCgxMiwgMSwgb3JkKCdPJykpCi0gICAgc3Rkc2NyLmFkZGNoKDE0LCAxLCBvcmQoJ04nKSkKLSAgICBzdGRzY3IuYWRkY2goMTYsIDEsIG9yZCgiJyIpKQotICAgIHN0ZHNjci5hZGRjaCgxOCwgMSwgb3JkKCdTJykpCi0KLSAgICByZXR1cm4KLQotZGVmIGdyZWV0KCk6Ci0gICAgc3Rkc2NyLmFkZGNoKDMsIDUsIG9yZCgnRycpKQotICAgIHN0ZHNjci5hZGRjaCg1LCA1LCBvcmQoJ1InKSkKLSAgICBzdGRzY3IuYWRkY2goNywgNSwgb3JkKCdFJykpCi0gICAgc3Rkc2NyLmFkZGNoKDksIDUsIG9yZCgnRScpKQotICAgIHN0ZHNjci5hZGRjaCgxMSwgNSwgb3JkKCdUJykpCi0gICAgc3Rkc2NyLmFkZGNoKDEzLCA1LCBvcmQoJ0knKSkKLSAgICBzdGRzY3IuYWRkY2goMTUsIDUsIG9yZCgnTicpKQotICAgIHN0ZHNjci5hZGRjaCgxNywgNSwgb3JkKCdHJykpCi0gICAgc3Rkc2NyLmFkZGNoKDE5LCA1LCBvcmQoJ1MnKSkKLQotICAgIHJldHVybgotCi1kZWYgZnJvbXdobygpOgotICAgIHN0ZHNjci5hZGRzdHIoMjEsIDEzLCBGUk9NV0hPKQotICAgIHJldHVybgotCi1kZWYgdHJlZSgpOgotICAgIHNldF9jb2xvcih0cmVlc2NybiwgY3Vyc2VzLkNPTE9SX0dSRUVOKQotICAgIHRyZWVzY3JuLmFkZGNoKDEsIDExLCBvcmQoJy8nKSkKLSAgICB0cmVlc2Nybi5hZGRjaCgyLCAxMSwgb3JkKCcvJykpCi0gICAgdHJlZXNjcm4uYWRkY2goMywgMTAsIG9yZCgnLycpKQotICAgIHRyZWVzY3JuLmFkZGNoKDQsIDksIG9yZCgnLycpKQotICAgIHRyZWVzY3JuLmFkZGNoKDUsIDksIG9yZCgnLycpKQotICAgIHRyZWVzY3JuLmFkZGNoKDYsIDgsIG9yZCgnLycpKQotICAgIHRyZWVzY3JuLmFkZGNoKDcsIDcsIG9yZCgnLycpKQotICAgIHRyZWVzY3JuLmFkZGNoKDgsIDYsIG9yZCgnLycpKQotICAgIHRyZWVzY3JuLmFkZGNoKDksIDYsIG9yZCgnLycpKQotICAgIHRyZWVzY3JuLmFkZGNoKDEwLCA1LCBvcmQoJy8nKSkKLSAgICB0cmVlc2Nybi5hZGRjaCgxMSwgMywgb3JkKCcvJykpCi0gICAgdHJlZXNjcm4uYWRkY2goMTIsIDIsIG9yZCgnLycpKQotCi0gICAgdHJlZXNjcm4uYWRkY2goMSwgMTMsIG9yZCgnXFwnKSkKLSAgICB0cmVlc2Nybi5hZGRjaCgyLCAxMywgb3JkKCdcXCcpKQotICAgIHRyZWVzY3JuLmFkZGNoKDMsIDE0LCBvcmQoJ1xcJykpCi0gICAgdHJlZXNjcm4uYWRkY2goNCwgMTUsIG9yZCgnXFwnKSkKLSAgICB0cmVlc2Nybi5hZGRjaCg1LCAxNSwgb3JkKCdcXCcpKQotICAgIHRyZWVzY3JuLmFkZGNoKDYsIDE2LCBvcmQoJ1xcJykpCi0gICAgdHJlZXNjcm4uYWRkY2goNywgMTcsIG9yZCgnXFwnKSkKLSAgICB0cmVlc2Nybi5hZGRjaCg4LCAxOCwgb3JkKCdcXCcpKQotICAgIHRyZWVzY3JuLmFkZGNoKDksIDE4LCBvcmQoJ1xcJykpCi0gICAgdHJlZXNjcm4uYWRkY2goMTAsIDE5LCBvcmQoJ1xcJykpCi0gICAgdHJlZXNjcm4uYWRkY2goMTEsIDIxLCBvcmQoJ1xcJykpCi0gICAgdHJlZXNjcm4uYWRkY2goMTIsIDIyLCBvcmQoJ1xcJykpCi0KLSAgICB0cmVlc2Nybi5hZGRjaCg0LCAxMCwgb3JkKCdfJykpCi0gICAgdHJlZXNjcm4uYWRkY2goNCwgMTQsIG9yZCgnXycpKQotICAgIHRyZWVzY3JuLmFkZGNoKDgsIDcsIG9yZCgnXycpKQotICAgIHRyZWVzY3JuLmFkZGNoKDgsIDE3LCBvcmQoJ18nKSkKLQotICAgIHRyZWVzY3JuLmFkZHN0cigxMywgMCwgIi8vLy8vLy8vLy8vLyBcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwiKQotCi0gICAgdHJlZXNjcm4uYWRkc3RyKDE0LCAxMSwgInwgfCIpCi0gICAgdHJlZXNjcm4uYWRkc3RyKDE1LCAxMSwgInxffCIpCi0KLSAgICB1bnNldF9jb2xvcih0cmVlc2NybikKLSAgICB0cmVlc2Nybi5yZWZyZXNoKCkKLSAgICB3X2RlbF9tc2cucmVmcmVzaCgpCi0KLSAgICByZXR1cm4KLQotZGVmIGJhbGxzKCk6Ci0gICAgdHJlZXNjcm4ub3ZlcmxheSh0cmVlc2NybjIpCi0KLSAgICBzZXRfY29sb3IodHJlZXNjcm4yLCBjdXJzZXMuQ09MT1JfQkxVRSkKLSAgICB0cmVlc2NybjIuYWRkY2goMywgOSwgb3JkKCdAJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDMsIDE1LCBvcmQoJ0AnKSkKLSAgICB0cmVlc2NybjIuYWRkY2goNCwgOCwgb3JkKCdAJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDQsIDE2LCBvcmQoJ0AnKSkKLSAgICB0cmVlc2NybjIuYWRkY2goNSwgNywgb3JkKCdAJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDUsIDE3LCBvcmQoJ0AnKSkKLSAgICB0cmVlc2NybjIuYWRkY2goNywgNiwgb3JkKCdAJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDcsIDE4LCBvcmQoJ0AnKSkKLSAgICB0cmVlc2NybjIuYWRkY2goOCwgNSwgb3JkKCdAJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDgsIDE5LCBvcmQoJ0AnKSkKLSAgICB0cmVlc2NybjIuYWRkY2goMTAsIDQsIG9yZCgnQCcpKQotICAgIHRyZWVzY3JuMi5hZGRjaCgxMCwgMjAsIG9yZCgnQCcpKQotICAgIHRyZWVzY3JuMi5hZGRjaCgxMSwgMiwgb3JkKCdAJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDExLCAyMiwgb3JkKCdAJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDEyLCAxLCBvcmQoJ0AnKSkKLSAgICB0cmVlc2NybjIuYWRkY2goMTIsIDIzLCBvcmQoJ0AnKSkKLQotICAgIHVuc2V0X2NvbG9yKHRyZWVzY3JuMikKLSAgICB0cmVlc2NybjIucmVmcmVzaCgpCi0gICAgd19kZWxfbXNnLnJlZnJlc2goKQotICAgIHJldHVybgotCi1kZWYgc3RhcigpOgotICAgIHRyZWVzY3JuMi5hdHRyc2V0KGN1cnNlcy5BX0JPTEQgfCBjdXJzZXMuQV9CTElOSykKLSAgICBzZXRfY29sb3IodHJlZXNjcm4yLCBjdXJzZXMuQ09MT1JfWUVMTE9XKQotCi0gICAgdHJlZXNjcm4yLmFkZGNoKDAsIDEyLCBvcmQoJyonKSkKLSAgICB0cmVlc2NybjIuc3RhbmRlbmQoKQotCi0gICAgdW5zZXRfY29sb3IodHJlZXNjcm4yKQotICAgIHRyZWVzY3JuMi5yZWZyZXNoKCkKLSAgICB3X2RlbF9tc2cucmVmcmVzaCgpCi0gICAgcmV0dXJuCi0KLWRlZiBzdHJuZzEoKToKLSAgICB0cmVlc2NybjIuYXR0cnNldChjdXJzZXMuQV9CT0xEIHwgY3Vyc2VzLkFfQkxJTkspCi0gICAgc2V0X2NvbG9yKHRyZWVzY3JuMiwgY3Vyc2VzLkNPTE9SX1dISVRFKQotCi0gICAgdHJlZXNjcm4yLmFkZGNoKDMsIDEzLCBvcmQoJ1wnJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDMsIDEyLCBvcmQoJzonKSkKLSAgICB0cmVlc2NybjIuYWRkY2goMywgMTEsIG9yZCgnLicpKQotCi0gICAgdHJlZXNjcm4yLmF0dHJvZmYoY3Vyc2VzLkFfQk9MRCB8IGN1cnNlcy5BX0JMSU5LKQotICAgIHVuc2V0X2NvbG9yKHRyZWVzY3JuMikKLQotICAgIHRyZWVzY3JuMi5yZWZyZXNoKCkKLSAgICB3X2RlbF9tc2cucmVmcmVzaCgpCi0gICAgcmV0dXJuCi0KLWRlZiBzdHJuZzIoKToKLSAgICB0cmVlc2NybjIuYXR0cnNldChjdXJzZXMuQV9CT0xEIHwgY3Vyc2VzLkFfQkxJTkspCi0gICAgc2V0X2NvbG9yKHRyZWVzY3JuMiwgY3Vyc2VzLkNPTE9SX1dISVRFKQotCi0gICAgdHJlZXNjcm4yLmFkZGNoKDUsIDE0LCBvcmQoJ1wnJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDUsIDEzLCBvcmQoJzonKSkKLSAgICB0cmVlc2NybjIuYWRkY2goNSwgMTIsIG9yZCgnLicpKQotICAgIHRyZWVzY3JuMi5hZGRjaCg1LCAxMSwgb3JkKCcsJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDYsIDEwLCBvcmQoJ1wnJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDYsIDksIG9yZCgnOicpKQotCi0gICAgdHJlZXNjcm4yLmF0dHJvZmYoY3Vyc2VzLkFfQk9MRCB8IGN1cnNlcy5BX0JMSU5LKQotICAgIHVuc2V0X2NvbG9yKHRyZWVzY3JuMikKLQotICAgIHRyZWVzY3JuMi5yZWZyZXNoKCkKLSAgICB3X2RlbF9tc2cucmVmcmVzaCgpCi0gICAgcmV0dXJuCi0KLWRlZiBzdHJuZzMoKToKLSAgICB0cmVlc2NybjIuYXR0cnNldChjdXJzZXMuQV9CT0xEIHwgY3Vyc2VzLkFfQkxJTkspCi0gICAgc2V0X2NvbG9yKHRyZWVzY3JuMiwgY3Vyc2VzLkNPTE9SX1dISVRFKQotCi0gICAgdHJlZXNjcm4yLmFkZGNoKDcsIDE2LCBvcmQoJ1wnJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDcsIDE1LCBvcmQoJzonKSkKLSAgICB0cmVlc2NybjIuYWRkY2goNywgMTQsIG9yZCgnLicpKQotICAgIHRyZWVzY3JuMi5hZGRjaCg3LCAxMywgb3JkKCcsJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDgsIDEyLCBvcmQoJ1wnJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDgsIDExLCBvcmQoJzonKSkKLSAgICB0cmVlc2NybjIuYWRkY2goOCwgMTAsIG9yZCgnLicpKQotICAgIHRyZWVzY3JuMi5hZGRjaCg4LCA5LCBvcmQoJywnKSkKLQotICAgIHRyZWVzY3JuMi5hdHRyb2ZmKGN1cnNlcy5BX0JPTEQgfCBjdXJzZXMuQV9CTElOSykKLSAgICB1bnNldF9jb2xvcih0cmVlc2NybjIpCi0KLSAgICB0cmVlc2NybjIucmVmcmVzaCgpCi0gICAgd19kZWxfbXNnLnJlZnJlc2goKQotICAgIHJldHVybgotCi1kZWYgc3Rybmc0KCk6Ci0gICAgdHJlZXNjcm4yLmF0dHJzZXQoY3Vyc2VzLkFfQk9MRCB8IGN1cnNlcy5BX0JMSU5LKQotICAgIHNldF9jb2xvcih0cmVlc2NybjIsIGN1cnNlcy5DT0xPUl9XSElURSkKLQotICAgIHRyZWVzY3JuMi5hZGRjaCg5LCAxNywgb3JkKCdcJycpKQotICAgIHRyZWVzY3JuMi5hZGRjaCg5LCAxNiwgb3JkKCc6JykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDksIDE1LCBvcmQoJy4nKSkKLSAgICB0cmVlc2NybjIuYWRkY2goOSwgMTQsIG9yZCgnLCcpKQotICAgIHRyZWVzY3JuMi5hZGRjaCgxMCwgMTMsIG9yZCgnXCcnKSkKLSAgICB0cmVlc2NybjIuYWRkY2goMTAsIDEyLCBvcmQoJzonKSkKLSAgICB0cmVlc2NybjIuYWRkY2goMTAsIDExLCBvcmQoJy4nKSkKLSAgICB0cmVlc2NybjIuYWRkY2goMTAsIDEwLCBvcmQoJywnKSkKLSAgICB0cmVlc2NybjIuYWRkY2goMTEsIDksIG9yZCgnXCcnKSkKLSAgICB0cmVlc2NybjIuYWRkY2goMTEsIDgsIG9yZCgnOicpKQotICAgIHRyZWVzY3JuMi5hZGRjaCgxMSwgNywgb3JkKCcuJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDExLCA2LCBvcmQoJywnKSkKLSAgICB0cmVlc2NybjIuYWRkY2goMTIsIDUsIG9yZCgnXCcnKSkKLQotICAgIHRyZWVzY3JuMi5hdHRyb2ZmKGN1cnNlcy5BX0JPTEQgfCBjdXJzZXMuQV9CTElOSykKLSAgICB1bnNldF9jb2xvcih0cmVlc2NybjIpCi0KLSAgICB0cmVlc2NybjIucmVmcmVzaCgpCi0gICAgd19kZWxfbXNnLnJlZnJlc2goKQotICAgIHJldHVybgotCi1kZWYgc3Rybmc1KCk6Ci0gICAgdHJlZXNjcm4yLmF0dHJzZXQoY3Vyc2VzLkFfQk9MRCB8IGN1cnNlcy5BX0JMSU5LKQotICAgIHNldF9jb2xvcih0cmVlc2NybjIsIGN1cnNlcy5DT0xPUl9XSElURSkKLQotICAgIHRyZWVzY3JuMi5hZGRjaCgxMSwgMTksIG9yZCgnXCcnKSkKLSAgICB0cmVlc2NybjIuYWRkY2goMTEsIDE4LCBvcmQoJzonKSkKLSAgICB0cmVlc2NybjIuYWRkY2goMTEsIDE3LCBvcmQoJy4nKSkKLSAgICB0cmVlc2NybjIuYWRkY2goMTEsIDE2LCBvcmQoJywnKSkKLSAgICB0cmVlc2NybjIuYWRkY2goMTIsIDE1LCBvcmQoJ1wnJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDEyLCAxNCwgb3JkKCc6JykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDEyLCAxMywgb3JkKCcuJykpCi0gICAgdHJlZXNjcm4yLmFkZGNoKDEyLCAxMiwgb3JkKCcsJykpCi0KLSAgICB0cmVlc2NybjIuYXR0cm9mZihjdXJzZXMuQV9CT0xEIHwgY3Vyc2VzLkFfQkxJTkspCi0gICAgdW5zZXRfY29sb3IodHJlZXNjcm4yKQotCi0gICAgIyBzYXZlIGEgZnVsbHkgbGl0IHRyZWUKLSAgICB0cmVlc2NybjIub3ZlcmxheSh0cmVlc2NybikKLQotICAgIHRyZWVzY3JuMi5yZWZyZXNoKCkKLSAgICB3X2RlbF9tc2cucmVmcmVzaCgpCi0gICAgcmV0dXJuCi0KLWRlZiBibGlua2l0KCk6Ci0gICAgdHJlZXNjcm44LnRvdWNod2luKCkKLQotICAgIGZvciBjeWNsZSBpbiByYW5nZSg1KToKLSAgICAgICAgaWYgY3ljbGUgPT0gMDoKLSAgICAgICAgICAgIHRyZWVzY3JuMy5vdmVybGF5KHRyZWVzY3JuOCkKLSAgICAgICAgICAgIHRyZWVzY3JuOC5yZWZyZXNoKCkKLSAgICAgICAgICAgIHdfZGVsX21zZy5yZWZyZXNoKCkKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGVsaWYgY3ljbGUgPT0gMToKLSAgICAgICAgICAgIHRyZWVzY3JuNC5vdmVybGF5KHRyZWVzY3JuOCkKLSAgICAgICAgICAgIHRyZWVzY3JuOC5yZWZyZXNoKCkKLSAgICAgICAgICAgIHdfZGVsX21zZy5yZWZyZXNoKCkKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGVsaWYgY3ljbGUgPT0gMjoKLSAgICAgICAgICAgIHRyZWVzY3JuNS5vdmVybGF5KHRyZWVzY3JuOCkKLSAgICAgICAgICAgIHRyZWVzY3JuOC5yZWZyZXNoKCkKLSAgICAgICAgICAgIHdfZGVsX21zZy5yZWZyZXNoKCkKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGVsaWYgY3ljbGUgPT0gMzoKLSAgICAgICAgICAgIHRyZWVzY3JuNi5vdmVybGF5KHRyZWVzY3JuOCkKLSAgICAgICAgICAgIHRyZWVzY3JuOC5yZWZyZXNoKCkKLSAgICAgICAgICAgIHdfZGVsX21zZy5yZWZyZXNoKCkKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGVsaWYgY3ljbGUgPT0gNDoKLSAgICAgICAgICAgIHRyZWVzY3JuNy5vdmVybGF5KHRyZWVzY3JuOCkKLSAgICAgICAgICAgIHRyZWVzY3JuOC5yZWZyZXNoKCkKLSAgICAgICAgICAgIHdfZGVsX21zZy5yZWZyZXNoKCkKLSAgICAgICAgICAgIGJyZWFrCi0KLSAgICAgICAgdHJlZXNjcm44LnRvdWNod2luKCkKLQotICAgICMgQUxMIE9OCi0gICAgdHJlZXNjcm4ub3ZlcmxheSh0cmVlc2NybjgpCi0gICAgdHJlZXNjcm44LnJlZnJlc2goKQotICAgIHdfZGVsX21zZy5yZWZyZXNoKCkKLQotICAgIHJldHVybgotCi1kZWYgZGVlcl9zdGVwKHdpbiwgeSwgeCk6Ci0gICAgd2luLm12d2luKHksIHgpCi0gICAgd2luLnJlZnJlc2goKQotICAgIHdfZGVsX21zZy5yZWZyZXNoKCkKLSAgICBsb29rX291dCg1KQotCi1kZWYgcmVpbmRlZXIoKToKLSAgICB5X3BvcyA9IDAKLQotICAgIGZvciB4X3BvcyBpbiByYW5nZSg3MCwgNjIsIC0xKToKLSAgICAgICAgaWYgeF9wb3MgPCA2NjogeV9wb3MgPSAxCi0gICAgICAgIGZvciBsb29wZXIgaW4gcmFuZ2UoMCwgNCk6Ci0gICAgICAgICAgICBkb3RkZWVyMC5hZGRjaCh5X3BvcywgeF9wb3MsIG9yZCgnLicpKQotICAgICAgICAgICAgZG90ZGVlcjAucmVmcmVzaCgpCi0gICAgICAgICAgICB3X2RlbF9tc2cucmVmcmVzaCgpCi0gICAgICAgICAgICBkb3RkZWVyMC5lcmFzZSgpCi0gICAgICAgICAgICBkb3RkZWVyMC5yZWZyZXNoKCkKLSAgICAgICAgICAgIHdfZGVsX21zZy5yZWZyZXNoKCkKLSAgICAgICAgICAgIGxvb2tfb3V0KDUwKQotCi0gICAgeV9wb3MgPSAyCi0KLSAgICBmb3IgeF9wb3MgaW4gcmFuZ2UoeF9wb3MgLSAxLCA1MCwgLTEpOgotICAgICAgICBmb3IgbG9vcGVyIGluIHJhbmdlKDAsIDQpOgotICAgICAgICAgICAgaWYgeF9wb3MgPCA1NjoKLSAgICAgICAgICAgICAgICB5X3BvcyA9IDMKLQotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgc3RhcmRlZXIwLmFkZGNoKHlfcG9zLCB4X3Bvcywgb3JkKCcqJykpCi0gICAgICAgICAgICAgICAgZXhjZXB0IGN1cnNlcy5lcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgICAgIHN0YXJkZWVyMC5yZWZyZXNoKCkKLSAgICAgICAgICAgICAgICB3X2RlbF9tc2cucmVmcmVzaCgpCi0gICAgICAgICAgICAgICAgc3RhcmRlZXIwLmVyYXNlKCkKLSAgICAgICAgICAgICAgICBzdGFyZGVlcjAucmVmcmVzaCgpCi0gICAgICAgICAgICAgICAgd19kZWxfbXNnLnJlZnJlc2goKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBkb3RkZWVyMC5hZGRjaCh5X3BvcywgeF9wb3MsIG9yZCgnKicpKQotICAgICAgICAgICAgICAgIGRvdGRlZXIwLnJlZnJlc2goKQotICAgICAgICAgICAgICAgIHdfZGVsX21zZy5yZWZyZXNoKCkKLSAgICAgICAgICAgICAgICBkb3RkZWVyMC5lcmFzZSgpCi0gICAgICAgICAgICAgICAgZG90ZGVlcjAucmVmcmVzaCgpCi0gICAgICAgICAgICAgICAgd19kZWxfbXNnLnJlZnJlc2goKQotCi0gICAgeF9wb3MgPSA1OAotCi0gICAgZm9yIHlfcG9zIGluIHJhbmdlKDIsIDUpOgotICAgICAgICBsaWxkZWVyMC50b3VjaHdpbigpCi0gICAgICAgIGxpbGRlZXIwLnJlZnJlc2goKQotICAgICAgICB3X2RlbF9tc2cucmVmcmVzaCgpCi0KLSAgICAgICAgZm9yIGxvb3BlciBpbiByYW5nZSgwLCA0KToKLSAgICAgICAgICAgIGRlZXJfc3RlcChsaWxkZWVyMywgeV9wb3MsIHhfcG9zKQotICAgICAgICAgICAgZGVlcl9zdGVwKGxpbGRlZXIyLCB5X3BvcywgeF9wb3MpCi0gICAgICAgICAgICBkZWVyX3N0ZXAobGlsZGVlcjEsIHlfcG9zLCB4X3BvcykKLSAgICAgICAgICAgIGRlZXJfc3RlcChsaWxkZWVyMiwgeV9wb3MsIHhfcG9zKQotICAgICAgICAgICAgZGVlcl9zdGVwKGxpbGRlZXIzLCB5X3BvcywgeF9wb3MpCi0KLSAgICAgICAgICAgIGxpbGRlZXIwLnRvdWNod2luKCkKLSAgICAgICAgICAgIGxpbGRlZXIwLnJlZnJlc2goKQotICAgICAgICAgICAgd19kZWxfbXNnLnJlZnJlc2goKQotCi0gICAgICAgICAgICB4X3BvcyAtPSAyCi0KLSAgICB4X3BvcyA9IDM1Ci0KLSAgICBmb3IgeV9wb3MgaW4gcmFuZ2UoNSwgMTApOgotCi0gICAgICAgIG1pZGRlZXIwLnRvdWNod2luKCkKLSAgICAgICAgbWlkZGVlcjAucmVmcmVzaCgpCi0gICAgICAgIHdfZGVsX21zZy5yZWZyZXNoKCkKLQotICAgICAgICBmb3IgbG9vcGVyIGluIHJhbmdlKDIpOgotICAgICAgICAgICAgZGVlcl9zdGVwKG1pZGRlZXIzLCB5X3BvcywgeF9wb3MpCi0gICAgICAgICAgICBkZWVyX3N0ZXAobWlkZGVlcjIsIHlfcG9zLCB4X3BvcykKLSAgICAgICAgICAgIGRlZXJfc3RlcChtaWRkZWVyMSwgeV9wb3MsIHhfcG9zKQotICAgICAgICAgICAgZGVlcl9zdGVwKG1pZGRlZXIyLCB5X3BvcywgeF9wb3MpCi0gICAgICAgICAgICBkZWVyX3N0ZXAobWlkZGVlcjMsIHlfcG9zLCB4X3BvcykKLQotICAgICAgICAgICAgbWlkZGVlcjAudG91Y2h3aW4oKQotICAgICAgICAgICAgbWlkZGVlcjAucmVmcmVzaCgpCi0gICAgICAgICAgICB3X2RlbF9tc2cucmVmcmVzaCgpCi0KLSAgICAgICAgICAgIHhfcG9zIC09IDMKLQotICAgIGxvb2tfb3V0KDMwMCkKLQotICAgIHlfcG9zID0gMQotCi0gICAgZm9yIHhfcG9zIGluIHJhbmdlKDgsIDE2KToKLSAgICAgICAgZGVlcl9zdGVwKGJpZ2RlZXI0LCB5X3BvcywgeF9wb3MpCi0gICAgICAgIGRlZXJfc3RlcChiaWdkZWVyMywgeV9wb3MsIHhfcG9zKQotICAgICAgICBkZWVyX3N0ZXAoYmlnZGVlcjIsIHlfcG9zLCB4X3BvcykKLSAgICAgICAgZGVlcl9zdGVwKGJpZ2RlZXIxLCB5X3BvcywgeF9wb3MpCi0gICAgICAgIGRlZXJfc3RlcChiaWdkZWVyMiwgeV9wb3MsIHhfcG9zKQotICAgICAgICBkZWVyX3N0ZXAoYmlnZGVlcjMsIHlfcG9zLCB4X3BvcykKLSAgICAgICAgZGVlcl9zdGVwKGJpZ2RlZXI0LCB5X3BvcywgeF9wb3MpCi0gICAgICAgIGRlZXJfc3RlcChiaWdkZWVyMCwgeV9wb3MsIHhfcG9zKQotCi0gICAgeF9wb3MgLT0gMQotCi0gICAgZm9yIGxvb3BlciBpbiByYW5nZSgwLCA2KToKLSAgICAgICAgZGVlcl9zdGVwKGxvb2tkZWVyNCwgeV9wb3MsIHhfcG9zKQotICAgICAgICBkZWVyX3N0ZXAobG9va2RlZXIzLCB5X3BvcywgeF9wb3MpCi0gICAgICAgIGRlZXJfc3RlcChsb29rZGVlcjIsIHlfcG9zLCB4X3BvcykKLSAgICAgICAgZGVlcl9zdGVwKGxvb2tkZWVyMSwgeV9wb3MsIHhfcG9zKQotICAgICAgICBkZWVyX3N0ZXAobG9va2RlZXIyLCB5X3BvcywgeF9wb3MpCi0gICAgICAgIGRlZXJfc3RlcChsb29rZGVlcjMsIHlfcG9zLCB4X3BvcykKLSAgICAgICAgZGVlcl9zdGVwKGxvb2tkZWVyNCwgeV9wb3MsIHhfcG9zKQotCi0gICAgZGVlcl9zdGVwKGxvb2tkZWVyMCwgeV9wb3MsIHhfcG9zKQotCi0gICAgZm9yIHlfcG9zIGluIHJhbmdlKHlfcG9zLCAxMCk6Ci0gICAgICAgIGZvciBsb29wZXIgaW4gcmFuZ2UoMCwgMik6Ci0gICAgICAgICAgICBkZWVyX3N0ZXAoYmlnZGVlcjQsIHlfcG9zLCB4X3BvcykKLSAgICAgICAgICAgIGRlZXJfc3RlcChiaWdkZWVyMywgeV9wb3MsIHhfcG9zKQotICAgICAgICAgICAgZGVlcl9zdGVwKGJpZ2RlZXIyLCB5X3BvcywgeF9wb3MpCi0gICAgICAgICAgICBkZWVyX3N0ZXAoYmlnZGVlcjEsIHlfcG9zLCB4X3BvcykKLSAgICAgICAgICAgIGRlZXJfc3RlcChiaWdkZWVyMiwgeV9wb3MsIHhfcG9zKQotICAgICAgICAgICAgZGVlcl9zdGVwKGJpZ2RlZXIzLCB5X3BvcywgeF9wb3MpCi0gICAgICAgICAgICBkZWVyX3N0ZXAoYmlnZGVlcjQsIHlfcG9zLCB4X3BvcykKLSAgICAgICAgZGVlcl9zdGVwKGJpZ2RlZXIwLCB5X3BvcywgeF9wb3MpCi0KLSAgICB5X3BvcyAtPSAxCi0KLSAgICBkZWVyX3N0ZXAobG9va2RlZXIzLCB5X3BvcywgeF9wb3MpCi0gICAgcmV0dXJuCi0KLWRlZiBtYWluKHdpbik6Ci0gICAgZ2xvYmFsIHN0ZHNjcgotICAgIHN0ZHNjciA9IHdpbgotCi0gICAgZ2xvYmFsIG15X2JnLCB5X3BvcywgeF9wb3MKLSAgICBnbG9iYWwgdHJlZXNjcm4sIHRyZWVzY3JuMiwgdHJlZXNjcm4zLCB0cmVlc2NybjQKLSAgICBnbG9iYWwgdHJlZXNjcm41LCB0cmVlc2NybjYsIHRyZWVzY3JuNywgdHJlZXNjcm44Ci0gICAgZ2xvYmFsIGRvdGRlZXIwLCBzdGFyZGVlcjAKLSAgICBnbG9iYWwgbGlsZGVlcjAsIGxpbGRlZXIxLCBsaWxkZWVyMiwgbGlsZGVlcjMKLSAgICBnbG9iYWwgbWlkZGVlcjAsIG1pZGRlZXIxLCBtaWRkZWVyMiwgbWlkZGVlcjMKLSAgICBnbG9iYWwgYmlnZGVlcjAsIGJpZ2RlZXIxLCBiaWdkZWVyMiwgYmlnZGVlcjMsIGJpZ2RlZXI0Ci0gICAgZ2xvYmFsIGxvb2tkZWVyMCwgbG9va2RlZXIxLCBsb29rZGVlcjIsIGxvb2tkZWVyMywgbG9va2RlZXI0Ci0gICAgZ2xvYmFsIHdfaG9saWRheSwgd19kZWxfbXNnCi0KLSAgICBteV9iZyA9IGN1cnNlcy5DT0xPUl9CTEFDSwotICAgICMgY3Vyc2VzLmN1cnNfc2V0KDApCi0KLSAgICB0cmVlc2NybiA9IGN1cnNlcy5uZXd3aW4oMTYsIDI3LCAzLCA1MykKLSAgICB0cmVlc2NybjIgPSBjdXJzZXMubmV3d2luKDE2LCAyNywgMywgNTMpCi0gICAgdHJlZXNjcm4zID0gY3Vyc2VzLm5ld3dpbigxNiwgMjcsIDMsIDUzKQotICAgIHRyZWVzY3JuNCA9IGN1cnNlcy5uZXd3aW4oMTYsIDI3LCAzLCA1MykKLSAgICB0cmVlc2NybjUgPSBjdXJzZXMubmV3d2luKDE2LCAyNywgMywgNTMpCi0gICAgdHJlZXNjcm42ID0gY3Vyc2VzLm5ld3dpbigxNiwgMjcsIDMsIDUzKQotICAgIHRyZWVzY3JuNyA9IGN1cnNlcy5uZXd3aW4oMTYsIDI3LCAzLCA1MykKLSAgICB0cmVlc2NybjggPSBjdXJzZXMubmV3d2luKDE2LCAyNywgMywgNTMpCi0KLSAgICBkb3RkZWVyMCA9IGN1cnNlcy5uZXd3aW4oMywgNzEsIDAsIDgpCi0KLSAgICBzdGFyZGVlcjAgPSBjdXJzZXMubmV3d2luKDQsIDU2LCAwLCA4KQotCi0gICAgbGlsZGVlcjAgPSBjdXJzZXMubmV3d2luKDcsIDUzLCAwLCA4KQotICAgIGxpbGRlZXIxID0gY3Vyc2VzLm5ld3dpbigyLCA0LCAwLCAwKQotICAgIGxpbGRlZXIyID0gY3Vyc2VzLm5ld3dpbigyLCA0LCAwLCAwKQotICAgIGxpbGRlZXIzID0gY3Vyc2VzLm5ld3dpbigyLCA0LCAwLCAwKQotCi0gICAgbWlkZGVlcjAgPSBjdXJzZXMubmV3d2luKDE1LCA0MiwgMCwgOCkKLSAgICBtaWRkZWVyMSA9IGN1cnNlcy5uZXd3aW4oMywgNywgMCwgMCkKLSAgICBtaWRkZWVyMiA9IGN1cnNlcy5uZXd3aW4oMywgNywgMCwgMCkKLSAgICBtaWRkZWVyMyA9IGN1cnNlcy5uZXd3aW4oMywgNywgMCwgMCkKLQotICAgIGJpZ2RlZXIwID0gY3Vyc2VzLm5ld3dpbigxMCwgMjMsIDAsIDApCi0gICAgYmlnZGVlcjEgPSBjdXJzZXMubmV3d2luKDEwLCAyMywgMCwgMCkKLSAgICBiaWdkZWVyMiA9IGN1cnNlcy5uZXd3aW4oMTAsIDIzLCAwLCAwKQotICAgIGJpZ2RlZXIzID0gY3Vyc2VzLm5ld3dpbigxMCwgMjMsIDAsIDApCi0gICAgYmlnZGVlcjQgPSBjdXJzZXMubmV3d2luKDEwLCAyMywgMCwgMCkKLQotICAgIGxvb2tkZWVyMCA9IGN1cnNlcy5uZXd3aW4oMTAsIDI1LCAwLCAwKQotICAgIGxvb2tkZWVyMSA9IGN1cnNlcy5uZXd3aW4oMTAsIDI1LCAwLCAwKQotICAgIGxvb2tkZWVyMiA9IGN1cnNlcy5uZXd3aW4oMTAsIDI1LCAwLCAwKQotICAgIGxvb2tkZWVyMyA9IGN1cnNlcy5uZXd3aW4oMTAsIDI1LCAwLCAwKQotICAgIGxvb2tkZWVyNCA9IGN1cnNlcy5uZXd3aW4oMTAsIDI1LCAwLCAwKQotCi0gICAgd19ob2xpZGF5ID0gY3Vyc2VzLm5ld3dpbigxLCAyNywgMywgMjcpCi0KLSAgICB3X2RlbF9tc2cgPSBjdXJzZXMubmV3d2luKDEsIDIwLCAyMywgNjApCi0KLSAgICB0cnk6Ci0gICAgICAgIHdfZGVsX21zZy5hZGRzdHIoMCwgMCwgIkhpdCBhbnkga2V5IHRvIHF1aXQiKQotICAgIGV4Y2VwdCBjdXJzZXMuZXJyb3I6Ci0gICAgICAgIHBhc3MKLQotICAgIHRyeToKLSAgICAgICAgd19ob2xpZGF5LmFkZHN0cigwLCAwLCAiSCBBIFAgUCBZICBIIE8gTCBJIEQgQSBZIFMiKQotICAgIGV4Y2VwdCBjdXJzZXMuZXJyb3I6Ci0gICAgICAgIHBhc3MKLQotICAgICMgc2V0IHVwIHRoZSB3aW5kb3dzIGZvciBvdXIgdmFyaW91cyByZWluZGVlcgotICAgIGxpbGRlZXIxLmFkZGNoKDAsIDAsIG9yZCgnVicpKQotICAgIGxpbGRlZXIxLmFkZGNoKDEsIDAsIG9yZCgnQCcpKQotICAgIGxpbGRlZXIxLmFkZGNoKDEsIDEsIG9yZCgnPCcpKQotICAgIGxpbGRlZXIxLmFkZGNoKDEsIDIsIG9yZCgnPicpKQotICAgIHRyeToKLSAgICAgICAgbGlsZGVlcjEuYWRkY2goMSwgMywgb3JkKCd+JykpCi0gICAgZXhjZXB0IGN1cnNlcy5lcnJvcjoKLSAgICAgICAgcGFzcwotCi0gICAgbGlsZGVlcjIuYWRkY2goMCwgMCwgb3JkKCdWJykpCi0gICAgbGlsZGVlcjIuYWRkY2goMSwgMCwgb3JkKCdAJykpCi0gICAgbGlsZGVlcjIuYWRkY2goMSwgMSwgb3JkKCd8JykpCi0gICAgbGlsZGVlcjIuYWRkY2goMSwgMiwgb3JkKCd8JykpCi0gICAgdHJ5OgotICAgICAgICBsaWxkZWVyMi5hZGRjaCgxLCAzLCBvcmQoJ34nKSkKLSAgICBleGNlcHQgY3Vyc2VzLmVycm9yOgotICAgICAgICBwYXNzCi0KLSAgICBsaWxkZWVyMy5hZGRjaCgwLCAwLCBvcmQoJ1YnKSkKLSAgICBsaWxkZWVyMy5hZGRjaCgxLCAwLCBvcmQoJ0AnKSkKLSAgICBsaWxkZWVyMy5hZGRjaCgxLCAxLCBvcmQoJz4nKSkKLSAgICBsaWxkZWVyMy5hZGRjaCgxLCAyLCBvcmQoJzwnKSkKLSAgICB0cnk6Ci0gICAgICAgIGxpbGRlZXIyLmFkZGNoKDEsIDMsIG9yZCgnficpKSAgIyBYWFgKLSAgICBleGNlcHQgY3Vyc2VzLmVycm9yOgotICAgICAgICBwYXNzCi0KLSAgICBtaWRkZWVyMS5hZGRjaCgwLCAyLCBvcmQoJ3knKSkKLSAgICBtaWRkZWVyMS5hZGRjaCgwLCAzLCBvcmQoJ3knKSkKLSAgICBtaWRkZWVyMS5hZGRjaCgxLCAyLCBvcmQoJzAnKSkKLSAgICBtaWRkZWVyMS5hZGRjaCgxLCAzLCBvcmQoJygnKSkKLSAgICBtaWRkZWVyMS5hZGRjaCgxLCA0LCBvcmQoJz0nKSkKLSAgICBtaWRkZWVyMS5hZGRjaCgxLCA1LCBvcmQoJyknKSkKLSAgICBtaWRkZWVyMS5hZGRjaCgxLCA2LCBvcmQoJ34nKSkKLSAgICBtaWRkZWVyMS5hZGRjaCgyLCAzLCBvcmQoJ1xcJykpCi0gICAgbWlkZGVlcjEuYWRkY2goMiwgNSwgb3JkKCcvJykpCi0KLSAgICBtaWRkZWVyMi5hZGRjaCgwLCAyLCBvcmQoJ3knKSkKLSAgICBtaWRkZWVyMi5hZGRjaCgwLCAzLCBvcmQoJ3knKSkKLSAgICBtaWRkZWVyMi5hZGRjaCgxLCAyLCBvcmQoJzAnKSkKLSAgICBtaWRkZWVyMi5hZGRjaCgxLCAzLCBvcmQoJygnKSkKLSAgICBtaWRkZWVyMi5hZGRjaCgxLCA0LCBvcmQoJz0nKSkKLSAgICBtaWRkZWVyMi5hZGRjaCgxLCA1LCBvcmQoJyknKSkKLSAgICBtaWRkZWVyMi5hZGRjaCgxLCA2LCBvcmQoJ34nKSkKLSAgICBtaWRkZWVyMi5hZGRjaCgyLCAzLCBvcmQoJ3wnKSkKLSAgICBtaWRkZWVyMi5hZGRjaCgyLCA1LCBvcmQoJ3wnKSkKLQotICAgIG1pZGRlZXIzLmFkZGNoKDAsIDIsIG9yZCgneScpKQotICAgIG1pZGRlZXIzLmFkZGNoKDAsIDMsIG9yZCgneScpKQotICAgIG1pZGRlZXIzLmFkZGNoKDEsIDIsIG9yZCgnMCcpKQotICAgIG1pZGRlZXIzLmFkZGNoKDEsIDMsIG9yZCgnKCcpKQotICAgIG1pZGRlZXIzLmFkZGNoKDEsIDQsIG9yZCgnPScpKQotICAgIG1pZGRlZXIzLmFkZGNoKDEsIDUsIG9yZCgnKScpKQotICAgIG1pZGRlZXIzLmFkZGNoKDEsIDYsIG9yZCgnficpKQotICAgIG1pZGRlZXIzLmFkZGNoKDIsIDMsIG9yZCgnLycpKQotICAgIG1pZGRlZXIzLmFkZGNoKDIsIDUsIG9yZCgnXFwnKSkKLQotICAgIGJpZ2RlZXIxLmFkZGNoKDAsIDE3LCBvcmQoJ1xcJykpCi0gICAgYmlnZGVlcjEuYWRkY2goMCwgMTgsIG9yZCgnLycpKQotICAgIGJpZ2RlZXIxLmFkZGNoKDAsIDE5LCBvcmQoJ1xcJykpCi0gICAgYmlnZGVlcjEuYWRkY2goMCwgMjAsIG9yZCgnLycpKQotICAgIGJpZ2RlZXIxLmFkZGNoKDEsIDE4LCBvcmQoJ1xcJykpCi0gICAgYmlnZGVlcjEuYWRkY2goMSwgMjAsIG9yZCgnLycpKQotICAgIGJpZ2RlZXIxLmFkZGNoKDIsIDE5LCBvcmQoJ3wnKSkKLSAgICBiaWdkZWVyMS5hZGRjaCgyLCAyMCwgb3JkKCdfJykpCi0gICAgYmlnZGVlcjEuYWRkY2goMywgMTgsIG9yZCgnLycpKQotICAgIGJpZ2RlZXIxLmFkZGNoKDMsIDE5LCBvcmQoJ14nKSkKLSAgICBiaWdkZWVyMS5hZGRjaCgzLCAyMCwgb3JkKCcwJykpCi0gICAgYmlnZGVlcjEuYWRkY2goMywgMjEsIG9yZCgnXFwnKSkKLSAgICBiaWdkZWVyMS5hZGRjaCg0LCAxNywgb3JkKCcvJykpCi0gICAgYmlnZGVlcjEuYWRkY2goNCwgMTgsIG9yZCgnLycpKQotICAgIGJpZ2RlZXIxLmFkZGNoKDQsIDE5LCBvcmQoJ1xcJykpCi0gICAgYmlnZGVlcjEuYWRkY2goNCwgMjIsIG9yZCgnXFwnKSkKLSAgICBiaWdkZWVyMS5hZGRzdHIoNSwgNywgIl5+fn5+fn5+fi8vICB+flUiKQotICAgIGJpZ2RlZXIxLmFkZHN0cig2LCA3LCAiKCBcXF9fX19fKCAvIikgICAgICAgIyApKQotICAgIGJpZ2RlZXIxLmFkZHN0cig3LCA4LCAiKCApICAgIC8iKQotICAgIGJpZ2RlZXIxLmFkZHN0cig4LCA5LCAiXFxcXCAgIC8iKQotICAgIGJpZ2RlZXIxLmFkZHN0cig5LCAxMSwgIlxcPi8+IikKLQotICAgIGJpZ2RlZXIyLmFkZGNoKDAsIDE3LCBvcmQoJ1xcJykpCi0gICAgYmlnZGVlcjIuYWRkY2goMCwgMTgsIG9yZCgnLycpKQotICAgIGJpZ2RlZXIyLmFkZGNoKDAsIDE5LCBvcmQoJ1xcJykpCi0gICAgYmlnZGVlcjIuYWRkY2goMCwgMjAsIG9yZCgnLycpKQotICAgIGJpZ2RlZXIyLmFkZGNoKDEsIDE4LCBvcmQoJ1xcJykpCi0gICAgYmlnZGVlcjIuYWRkY2goMSwgMjAsIG9yZCgnLycpKQotICAgIGJpZ2RlZXIyLmFkZGNoKDIsIDE5LCBvcmQoJ3wnKSkKLSAgICBiaWdkZWVyMi5hZGRjaCgyLCAyMCwgb3JkKCdfJykpCi0gICAgYmlnZGVlcjIuYWRkY2goMywgMTgsIG9yZCgnLycpKQotICAgIGJpZ2RlZXIyLmFkZGNoKDMsIDE5LCBvcmQoJ14nKSkKLSAgICBiaWdkZWVyMi5hZGRjaCgzLCAyMCwgb3JkKCcwJykpCi0gICAgYmlnZGVlcjIuYWRkY2goMywgMjEsIG9yZCgnXFwnKSkKLSAgICBiaWdkZWVyMi5hZGRjaCg0LCAxNywgb3JkKCcvJykpCi0gICAgYmlnZGVlcjIuYWRkY2goNCwgMTgsIG9yZCgnLycpKQotICAgIGJpZ2RlZXIyLmFkZGNoKDQsIDE5LCBvcmQoJ1xcJykpCi0gICAgYmlnZGVlcjIuYWRkY2goNCwgMjIsIG9yZCgnXFwnKSkKLSAgICBiaWdkZWVyMi5hZGRzdHIoNSwgNywgIl5+fn5+fn5+fi8vICB+flUiKQotICAgIGJpZ2RlZXIyLmFkZHN0cig2LCA3LCAiKCggKV9fX18oIC8iKSAgICAgICAgIyApKQotICAgIGJpZ2RlZXIyLmFkZHN0cig3LCA3LCAiKCAvICAgIHwiKQotICAgIGJpZ2RlZXIyLmFkZHN0cig4LCA4LCAiXFwvICAgIHwiKQotICAgIGJpZ2RlZXIyLmFkZHN0cig5LCA5LCAifD4gICB8PiIpCi0KLSAgICBiaWdkZWVyMy5hZGRjaCgwLCAxNywgb3JkKCdcXCcpKQotICAgIGJpZ2RlZXIzLmFkZGNoKDAsIDE4LCBvcmQoJy8nKSkKLSAgICBiaWdkZWVyMy5hZGRjaCgwLCAxOSwgb3JkKCdcXCcpKQotICAgIGJpZ2RlZXIzLmFkZGNoKDAsIDIwLCBvcmQoJy8nKSkKLSAgICBiaWdkZWVyMy5hZGRjaCgxLCAxOCwgb3JkKCdcXCcpKQotICAgIGJpZ2RlZXIzLmFkZGNoKDEsIDIwLCBvcmQoJy8nKSkKLSAgICBiaWdkZWVyMy5hZGRjaCgyLCAxOSwgb3JkKCd8JykpCi0gICAgYmlnZGVlcjMuYWRkY2goMiwgMjAsIG9yZCgnXycpKQotICAgIGJpZ2RlZXIzLmFkZGNoKDMsIDE4LCBvcmQoJy8nKSkKLSAgICBiaWdkZWVyMy5hZGRjaCgzLCAxOSwgb3JkKCdeJykpCi0gICAgYmlnZGVlcjMuYWRkY2goMywgMjAsIG9yZCgnMCcpKQotICAgIGJpZ2RlZXIzLmFkZGNoKDMsIDIxLCBvcmQoJ1xcJykpCi0gICAgYmlnZGVlcjMuYWRkY2goNCwgMTcsIG9yZCgnLycpKQotICAgIGJpZ2RlZXIzLmFkZGNoKDQsIDE4LCBvcmQoJy8nKSkKLSAgICBiaWdkZWVyMy5hZGRjaCg0LCAxOSwgb3JkKCdcXCcpKQotICAgIGJpZ2RlZXIzLmFkZGNoKDQsIDIyLCBvcmQoJ1xcJykpCi0gICAgYmlnZGVlcjMuYWRkc3RyKDUsIDcsICJefn5+fn5+fn4vLyAgfn5VIikKLSAgICBiaWdkZWVyMy5hZGRzdHIoNiwgNiwgIiggKClfX19fXyggLyIpICAgICAgICMgKSkKLSAgICBiaWdkZWVyMy5hZGRzdHIoNywgNiwgIi8gLyAgICAgICAvIikKLSAgICBiaWdkZWVyMy5hZGRzdHIoOCwgNSwgInwvICAgICAgICAgIFxcIikKLSAgICBiaWdkZWVyMy5hZGRzdHIoOSwgNSwgIi8+ICAgICAgICAgICBcXD4iKQotCi0gICAgYmlnZGVlcjQuYWRkY2goMCwgMTcsIG9yZCgnXFwnKSkKLSAgICBiaWdkZWVyNC5hZGRjaCgwLCAxOCwgb3JkKCcvJykpCi0gICAgYmlnZGVlcjQuYWRkY2goMCwgMTksIG9yZCgnXFwnKSkKLSAgICBiaWdkZWVyNC5hZGRjaCgwLCAyMCwgb3JkKCcvJykpCi0gICAgYmlnZGVlcjQuYWRkY2goMSwgMTgsIG9yZCgnXFwnKSkKLSAgICBiaWdkZWVyNC5hZGRjaCgxLCAyMCwgb3JkKCcvJykpCi0gICAgYmlnZGVlcjQuYWRkY2goMiwgMTksIG9yZCgnfCcpKQotICAgIGJpZ2RlZXI0LmFkZGNoKDIsIDIwLCBvcmQoJ18nKSkKLSAgICBiaWdkZWVyNC5hZGRjaCgzLCAxOCwgb3JkKCcvJykpCi0gICAgYmlnZGVlcjQuYWRkY2goMywgMTksIG9yZCgnXicpKQotICAgIGJpZ2RlZXI0LmFkZGNoKDMsIDIwLCBvcmQoJzAnKSkKLSAgICBiaWdkZWVyNC5hZGRjaCgzLCAyMSwgb3JkKCdcXCcpKQotICAgIGJpZ2RlZXI0LmFkZGNoKDQsIDE3LCBvcmQoJy8nKSkKLSAgICBiaWdkZWVyNC5hZGRjaCg0LCAxOCwgb3JkKCcvJykpCi0gICAgYmlnZGVlcjQuYWRkY2goNCwgMTksIG9yZCgnXFwnKSkKLSAgICBiaWdkZWVyNC5hZGRjaCg0LCAyMiwgb3JkKCdcXCcpKQotICAgIGJpZ2RlZXI0LmFkZHN0cig1LCA3LCAiXn5+fn5+fn5+Ly8gIH5+VSIpCi0gICAgYmlnZGVlcjQuYWRkc3RyKDYsIDYsICIoIClfX19fX18oIC8iKSAgICAgICAjICkKLSAgICBiaWdkZWVyNC5hZGRzdHIoNywgNSwgIigvICAgICAgICAgIFxcIikgICAgICMgKQotICAgIGJpZ2RlZXI0LmFkZHN0cig4LCAwLCAidl9fXz0gICAgICAgICAgICAgLS0tLV4iKQotCi0gICAgbG9va2RlZXIxLmFkZHN0cigwLCAxNiwgIlxcLyAgICAgXFwvIikKLSAgICBsb29rZGVlcjEuYWRkc3RyKDEsIDE3LCAiXFxZLyBcXFkvIikKLSAgICBsb29rZGVlcjEuYWRkc3RyKDIsIDE5LCAiXFw9LyIpCi0gICAgbG9va2RlZXIxLmFkZHN0cigzLCAxNywgIl5cXG8gby9eIikKLSAgICBsb29rZGVlcjEuYWRkc3RyKDQsIDE3LCAiLy8oICkiKQotICAgIGxvb2tkZWVyMS5hZGRzdHIoNSwgNywgIl5+fn5+fn5+fi8vIFxcTy8iKQotICAgIGxvb2tkZWVyMS5hZGRzdHIoNiwgNywgIiggXFxfX19fXyggLyIpICAgICAgIyApKQotICAgIGxvb2tkZWVyMS5hZGRzdHIoNywgOCwgIiggKSAgICAvIikKLSAgICBsb29rZGVlcjEuYWRkc3RyKDgsIDksICJcXFxcICAgLyIpCi0gICAgbG9va2RlZXIxLmFkZHN0cig5LCAxMSwgIlxcPi8+IikKLQotICAgIGxvb2tkZWVyMi5hZGRzdHIoMCwgMTYsICJcXC8gICAgIFxcLyIpCi0gICAgbG9va2RlZXIyLmFkZHN0cigxLCAxNywgIlxcWS8gXFxZLyIpCi0gICAgbG9va2RlZXIyLmFkZHN0cigyLCAxOSwgIlxcPS8iKQotICAgIGxvb2tkZWVyMi5hZGRzdHIoMywgMTcsICJeXFxvIG8vXiIpCi0gICAgbG9va2RlZXIyLmFkZHN0cig0LCAxNywgIi8vKCApIikKLSAgICBsb29rZGVlcjIuYWRkc3RyKDUsIDcsICJefn5+fn5+fn4vLyBcXE8vIikKLSAgICBsb29rZGVlcjIuYWRkc3RyKDYsIDcsICIoKCApX19fXyggLyIpICAgICAgICMgKSkKLSAgICBsb29rZGVlcjIuYWRkc3RyKDcsIDcsICIoIC8gICAgfCIpCi0gICAgbG9va2RlZXIyLmFkZHN0cig4LCA4LCAiXFwvICAgIHwiKQotICAgIGxvb2tkZWVyMi5hZGRzdHIoOSwgOSwgInw+ICAgfD4iKQotCi0gICAgbG9va2RlZXIzLmFkZHN0cigwLCAxNiwgIlxcLyAgICAgXFwvIikKLSAgICBsb29rZGVlcjMuYWRkc3RyKDEsIDE3LCAiXFxZLyBcXFkvIikKLSAgICBsb29rZGVlcjMuYWRkc3RyKDIsIDE5LCAiXFw9LyIpCi0gICAgbG9va2RlZXIzLmFkZHN0cigzLCAxNywgIl5cXG8gby9eIikKLSAgICBsb29rZGVlcjMuYWRkc3RyKDQsIDE3LCAiLy8oICkiKQotICAgIGxvb2tkZWVyMy5hZGRzdHIoNSwgNywgIl5+fn5+fn5+fi8vIFxcTy8iKQotICAgIGxvb2tkZWVyMy5hZGRzdHIoNiwgNiwgIiggKClfX19fXyggLyIpICAgICAgIyApKQotICAgIGxvb2tkZWVyMy5hZGRzdHIoNywgNiwgIi8gLyAgICAgICAvIikKLSAgICBsb29rZGVlcjMuYWRkc3RyKDgsIDUsICJ8LyAgICAgICAgICBcXCIpCi0gICAgbG9va2RlZXIzLmFkZHN0cig5LCA1LCAiLz4gICAgICAgICAgIFxcPiIpCi0KLSAgICBsb29rZGVlcjQuYWRkc3RyKDAsIDE2LCAiXFwvICAgICBcXC8iKQotICAgIGxvb2tkZWVyNC5hZGRzdHIoMSwgMTcsICJcXFkvIFxcWS8iKQotICAgIGxvb2tkZWVyNC5hZGRzdHIoMiwgMTksICJcXD0vIikKLSAgICBsb29rZGVlcjQuYWRkc3RyKDMsIDE3LCAiXlxcbyBvL14iKQotICAgIGxvb2tkZWVyNC5hZGRzdHIoNCwgMTcsICIvLyggKSIpCi0gICAgbG9va2RlZXI0LmFkZHN0cig1LCA3LCAiXn5+fn5+fn5+Ly8gXFxPLyIpCi0gICAgbG9va2RlZXI0LmFkZHN0cig2LCA2LCAiKCApX19fX19fKCAvIikgICAgICAjICkKLSAgICBsb29rZGVlcjQuYWRkc3RyKDcsIDUsICIoLyAgICAgICAgICBcXCIpICAgICMgKQotICAgIGxvb2tkZWVyNC5hZGRzdHIoOCwgMCwgInZfX189ICAgICAgICAgICAgIC0tLS1eIikKLQotICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0gICAgY3Vyc2VzLmNicmVhaygpCi0gICAgc3Rkc2NyLm5vZGVsYXkoMSkKLQotICAgIHdoaWxlIDE6Ci0gICAgICAgIHN0ZHNjci5jbGVhcigpCi0gICAgICAgIHRyZWVzY3JuLmVyYXNlKCkKLSAgICAgICAgd19kZWxfbXNnLnRvdWNod2luKCkKLSAgICAgICAgdHJlZXNjcm4udG91Y2h3aW4oKQotICAgICAgICB0cmVlc2NybjIuZXJhc2UoKQotICAgICAgICB0cmVlc2NybjIudG91Y2h3aW4oKQotICAgICAgICB0cmVlc2NybjguZXJhc2UoKQotICAgICAgICB0cmVlc2NybjgudG91Y2h3aW4oKQotICAgICAgICBzdGRzY3IucmVmcmVzaCgpCi0gICAgICAgIGxvb2tfb3V0KDE1MCkKLSAgICAgICAgYm94aXQoKQotICAgICAgICBzdGRzY3IucmVmcmVzaCgpCi0gICAgICAgIGxvb2tfb3V0KDE1MCkKLSAgICAgICAgc2VhcygpCi0gICAgICAgIHN0ZHNjci5yZWZyZXNoKCkKLSAgICAgICAgZ3JlZXQoKQotICAgICAgICBzdGRzY3IucmVmcmVzaCgpCi0gICAgICAgIGxvb2tfb3V0KDE1MCkKLSAgICAgICAgZnJvbXdobygpCi0gICAgICAgIHN0ZHNjci5yZWZyZXNoKCkKLSAgICAgICAgbG9va19vdXQoMTUwKQotICAgICAgICB0cmVlKCkKLSAgICAgICAgbG9va19vdXQoMTUwKQotICAgICAgICBiYWxscygpCi0gICAgICAgIGxvb2tfb3V0KDE1MCkKLSAgICAgICAgc3RhcigpCi0gICAgICAgIGxvb2tfb3V0KDE1MCkKLSAgICAgICAgc3RybmcxKCkKLSAgICAgICAgc3RybmcyKCkKLSAgICAgICAgc3RybmczKCkKLSAgICAgICAgc3Rybmc0KCkKLSAgICAgICAgc3Rybmc1KCkKLQotICAgICAgICAjIHNldCB1cCB0aGUgd2luZG93cyBmb3Igb3VyIGJsaW5raW5nIHRyZWVzCi0gICAgICAgICMKLSAgICAgICAgIyB0cmVlc2NybjMKLSAgICAgICAgdHJlZXNjcm4ub3ZlcmxheSh0cmVlc2NybjMpCi0KLSAgICAgICAgIyBiYWxscwotICAgICAgICB0cmVlc2NybjMuYWRkY2goNCwgMTgsIG9yZCgnICcpKQotICAgICAgICB0cmVlc2NybjMuYWRkY2goNywgNiwgb3JkKCcgJykpCi0gICAgICAgIHRyZWVzY3JuMy5hZGRjaCg4LCAxOSwgb3JkKCcgJykpCi0gICAgICAgIHRyZWVzY3JuMy5hZGRjaCgxMSwgMjIsIG9yZCgnICcpKQotCi0gICAgICAgICMgc3RhcgotICAgICAgICB0cmVlc2NybjMuYWRkY2goMCwgMTIsIG9yZCgnKicpKQotCi0gICAgICAgICMgc3RybmcxCi0gICAgICAgIHRyZWVzY3JuMy5hZGRjaCgzLCAxMSwgb3JkKCcgJykpCi0KLSAgICAgICAgIyBzdHJuZzIKLSAgICAgICAgdHJlZXNjcm4zLmFkZGNoKDUsIDEzLCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm4zLmFkZGNoKDYsIDEwLCBvcmQoJyAnKSkKLQotICAgICAgICAjIHN0cm5nMwotICAgICAgICB0cmVlc2NybjMuYWRkY2goNywgMTYsIG9yZCgnICcpKQotICAgICAgICB0cmVlc2NybjMuYWRkY2goNywgMTQsIG9yZCgnICcpKQotCi0gICAgICAgICMgc3Rybmc0Ci0gICAgICAgIHRyZWVzY3JuMy5hZGRjaCgxMCwgMTMsIG9yZCgnICcpKQotICAgICAgICB0cmVlc2NybjMuYWRkY2goMTAsIDEwLCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm4zLmFkZGNoKDExLCA4LCBvcmQoJyAnKSkKLQotICAgICAgICAjIHN0cm5nNQotICAgICAgICB0cmVlc2NybjMuYWRkY2goMTEsIDE4LCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm4zLmFkZGNoKDEyLCAxMywgb3JkKCcgJykpCi0KLSAgICAgICAgIyB0cmVlc2NybjQKLSAgICAgICAgdHJlZXNjcm4ub3ZlcmxheSh0cmVlc2NybjQpCi0KLSAgICAgICAgIyBiYWxscwotICAgICAgICB0cmVlc2NybjQuYWRkY2goMywgOSwgb3JkKCcgJykpCi0gICAgICAgIHRyZWVzY3JuNC5hZGRjaCg0LCAxNiwgb3JkKCcgJykpCi0gICAgICAgIHRyZWVzY3JuNC5hZGRjaCg3LCA2LCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm40LmFkZGNoKDgsIDE5LCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm40LmFkZGNoKDExLCAyLCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm40LmFkZGNoKDEyLCAyMywgb3JkKCcgJykpCi0KLSAgICAgICAgIyBzdGFyCi0gICAgICAgIHRyZWVzY3JuNC5zdGFuZG91dCgpCi0gICAgICAgIHRyZWVzY3JuNC5hZGRjaCgwLCAxMiwgb3JkKCcqJykpCi0gICAgICAgIHRyZWVzY3JuNC5zdGFuZGVuZCgpCi0KLSAgICAgICAgIyBzdHJuZzEKLSAgICAgICAgdHJlZXNjcm40LmFkZGNoKDMsIDEzLCBvcmQoJyAnKSkKLQotICAgICAgICAjIHN0cm5nMgotCi0gICAgICAgICMgc3RybmczCi0gICAgICAgIHRyZWVzY3JuNC5hZGRjaCg3LCAxNSwgb3JkKCcgJykpCi0gICAgICAgIHRyZWVzY3JuNC5hZGRjaCg4LCAxMSwgb3JkKCcgJykpCi0KLSAgICAgICAgIyBzdHJuZzQKLSAgICAgICAgdHJlZXNjcm40LmFkZGNoKDksIDE2LCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm40LmFkZGNoKDEwLCAxMiwgb3JkKCcgJykpCi0gICAgICAgIHRyZWVzY3JuNC5hZGRjaCgxMSwgOCwgb3JkKCcgJykpCi0KLSAgICAgICAgIyBzdHJuZzUKLSAgICAgICAgdHJlZXNjcm40LmFkZGNoKDExLCAxOCwgb3JkKCcgJykpCi0gICAgICAgIHRyZWVzY3JuNC5hZGRjaCgxMiwgMTQsIG9yZCgnICcpKQotCi0gICAgICAgICMgdHJlZXNjcm41Ci0gICAgICAgIHRyZWVzY3JuLm92ZXJsYXkodHJlZXNjcm41KQotCi0gICAgICAgICMgYmFsbHMKLSAgICAgICAgdHJlZXNjcm41LmFkZGNoKDMsIDE1LCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm41LmFkZGNoKDEwLCAyMCwgb3JkKCcgJykpCi0gICAgICAgIHRyZWVzY3JuNS5hZGRjaCgxMiwgMSwgb3JkKCcgJykpCi0KLSAgICAgICAgIyBzdGFyCi0gICAgICAgIHRyZWVzY3JuNS5hZGRjaCgwLCAxMiwgb3JkKCcgJykpCi0KLSAgICAgICAgIyBzdHJuZzEKLSAgICAgICAgdHJlZXNjcm41LmFkZGNoKDMsIDExLCBvcmQoJyAnKSkKLQotICAgICAgICAjIHN0cm5nMgotICAgICAgICB0cmVlc2NybjUuYWRkY2goNSwgMTIsIG9yZCgnICcpKQotCi0gICAgICAgICMgc3RybmczCi0gICAgICAgIHRyZWVzY3JuNS5hZGRjaCg3LCAxNCwgb3JkKCcgJykpCi0gICAgICAgIHRyZWVzY3JuNS5hZGRjaCg4LCAxMCwgb3JkKCcgJykpCi0KLSAgICAgICAgIyBzdHJuZzQKLSAgICAgICAgdHJlZXNjcm41LmFkZGNoKDksIDE1LCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm41LmFkZGNoKDEwLCAxMSwgb3JkKCcgJykpCi0gICAgICAgIHRyZWVzY3JuNS5hZGRjaCgxMSwgNywgb3JkKCcgJykpCi0KLSAgICAgICAgIyBzdHJuZzUKLSAgICAgICAgdHJlZXNjcm41LmFkZGNoKDExLCAxNywgb3JkKCcgJykpCi0gICAgICAgIHRyZWVzY3JuNS5hZGRjaCgxMiwgMTMsIG9yZCgnICcpKQotCi0gICAgICAgICMgdHJlZXNjcm42Ci0gICAgICAgIHRyZWVzY3JuLm92ZXJsYXkodHJlZXNjcm42KQotCi0gICAgICAgICMgYmFsbHMKLSAgICAgICAgdHJlZXNjcm42LmFkZGNoKDYsIDcsIG9yZCgnICcpKQotICAgICAgICB0cmVlc2NybjYuYWRkY2goNywgMTgsIG9yZCgnICcpKQotICAgICAgICB0cmVlc2NybjYuYWRkY2goMTAsIDQsIG9yZCgnICcpKQotICAgICAgICB0cmVlc2NybjYuYWRkY2goMTEsIDIzLCBvcmQoJyAnKSkKLQotICAgICAgICAjIHN0YXIKLSAgICAgICAgdHJlZXNjcm42LnN0YW5kb3V0KCkKLSAgICAgICAgdHJlZXNjcm42LmFkZGNoKDAsIDEyLCBvcmQoJyonKSkKLSAgICAgICAgdHJlZXNjcm42LnN0YW5kZW5kKCkKLQotICAgICAgICAjIHN0cm5nMQotCi0gICAgICAgICMgc3RybmcyCi0gICAgICAgIHRyZWVzY3JuNi5hZGRjaCg1LCAxMSwgb3JkKCcgJykpCi0KLSAgICAgICAgIyBzdHJuZzMKLSAgICAgICAgdHJlZXNjcm42LmFkZGNoKDcsIDEzLCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm42LmFkZGNoKDgsIDksIG9yZCgnICcpKQotCi0gICAgICAgICMgc3Rybmc0Ci0gICAgICAgIHRyZWVzY3JuNi5hZGRjaCg5LCAxNCwgb3JkKCcgJykpCi0gICAgICAgIHRyZWVzY3JuNi5hZGRjaCgxMCwgMTAsIG9yZCgnICcpKQotICAgICAgICB0cmVlc2NybjYuYWRkY2goMTEsIDYsIG9yZCgnICcpKQotCi0gICAgICAgICMgc3Rybmc1Ci0gICAgICAgIHRyZWVzY3JuNi5hZGRjaCgxMSwgMTYsIG9yZCgnICcpKQotICAgICAgICB0cmVlc2NybjYuYWRkY2goMTIsIDEyLCBvcmQoJyAnKSkKLQotICAgICAgICAjICB0cmVlc2NybjcKLQotICAgICAgICB0cmVlc2Nybi5vdmVybGF5KHRyZWVzY3JuNykKLQotICAgICAgICAjIGJhbGxzCi0gICAgICAgIHRyZWVzY3JuNy5hZGRjaCgzLCAxNSwgb3JkKCcgJykpCi0gICAgICAgIHRyZWVzY3JuNy5hZGRjaCg2LCA3LCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm43LmFkZGNoKDcsIDE4LCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm43LmFkZGNoKDEwLCA0LCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm43LmFkZGNoKDExLCAyMiwgb3JkKCcgJykpCi0KLSAgICAgICAgIyBzdGFyCi0gICAgICAgIHRyZWVzY3JuNy5hZGRjaCgwLCAxMiwgb3JkKCcqJykpCi0KLSAgICAgICAgIyBzdHJuZzEKLSAgICAgICAgdHJlZXNjcm43LmFkZGNoKDMsIDEyLCBvcmQoJyAnKSkKLQotICAgICAgICAjIHN0cm5nMgotICAgICAgICB0cmVlc2NybjcuYWRkY2goNSwgMTMsIG9yZCgnICcpKQotICAgICAgICB0cmVlc2NybjcuYWRkY2goNiwgOSwgb3JkKCcgJykpCi0KLSAgICAgICAgIyBzdHJuZzMKLSAgICAgICAgdHJlZXNjcm43LmFkZGNoKDcsIDE1LCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm43LmFkZGNoKDgsIDExLCBvcmQoJyAnKSkKLQotICAgICAgICAjIHN0cm5nNAotICAgICAgICB0cmVlc2NybjcuYWRkY2goOSwgMTYsIG9yZCgnICcpKQotICAgICAgICB0cmVlc2NybjcuYWRkY2goMTAsIDEyLCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm43LmFkZGNoKDExLCA4LCBvcmQoJyAnKSkKLQotICAgICAgICAjIHN0cm5nNQotICAgICAgICB0cmVlc2NybjcuYWRkY2goMTEsIDE4LCBvcmQoJyAnKSkKLSAgICAgICAgdHJlZXNjcm43LmFkZGNoKDEyLCAxNCwgb3JkKCcgJykpCi0KLSAgICAgICAgbG9va19vdXQoMTUwKQotICAgICAgICByZWluZGVlcigpCi0KLSAgICAgICAgd19ob2xpZGF5LnRvdWNod2luKCkKLSAgICAgICAgd19ob2xpZGF5LnJlZnJlc2goKQotICAgICAgICB3X2RlbF9tc2cucmVmcmVzaCgpCi0KLSAgICAgICAgbG9va19vdXQoNTAwKQotICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCAyMCk6Ci0gICAgICAgICAgICBibGlua2l0KCkKLQotY3Vyc2VzLndyYXBwZXIobWFpbikKZGlmZiAtLWdpdCBhL0RlbW8vbWQ1dGVzdC9SRUFETUUgYi9EZW1vL21kNXRlc3QvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTc2MjFlLi4wMDAwMDAwCi0tLSBhL0RlbW8vbWQ1dGVzdC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1UaGlzIGlzIHRoZSBQeXRob24gdmVyc2lvbiBvZiB0aGUgTUQ1IHRlc3QgcHJvZ3JhbSBmcm9tIHRoZSBNRDUKLUludGVybmV0IERyYWZ0IChSaXZlc3QgYW5kIER1c3NlLCBUaGUgTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSwgMTAKLUp1bHkgMTk5MSkuICBUaGUgZmlsZSAiZm9vIiBjb250YWlucyB0aGUgc3RyaW5nICJhYmMiIHdpdGggbm8gdHJhaWxpbmcKLW5ld2xpbmUuCi0KLVdoZW4gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLCBpdCBhY3RzIGFzIGEgZmlsdGVyLiAgV2hlbiBjYWxsZWQgd2l0aAotIi14IiwgaXQgZXhlY3V0ZXMgYSBzZWxmLXRlc3QsIGFuZCB0aGUgb3V0cHV0IHNob3VsZCBsaXRlcmFsbHkgbWF0Y2gKLXRoZSBvdXRwdXQgZ2l2ZW4gaW4gdGhlIFJGQy4KLQotQ29kZSBieSBKYW4tSGVpbiBCXCJ1aHJtYW4gYWZ0ZXIgdGhlIG9yaWdpbmFsIGluIEMuCmRpZmYgLS1naXQgYS9EZW1vL21kNXRlc3QvZm9vIGIvRGVtby9tZDV0ZXN0L2ZvbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjJiYThmOC4uMDAwMDAwMAotLS0gYS9EZW1vL21kNXRlc3QvZm9vCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYWJjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvRGVtby9tZDV0ZXN0L21kNWRyaXZlci5weSBiL0RlbW8vbWQ1dGVzdC9tZDVkcml2ZXIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNTYxYWIuLjAwMDAwMDAKLS0tIGEvRGVtby9tZDV0ZXN0L21kNWRyaXZlci5weQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi1mcm9tIGhhc2hsaWIgaW1wb3J0IG1kNQotaW1wb3J0IHN0cmluZwotZnJvbSBzeXMgaW1wb3J0IGFyZ3YKLQotZGVmIE1EUHJpbnQoc3RyKToKLSAgICBvdXRzdHIgPSAnJwotICAgIGZvciBvIGluIHN0cjoKLSAgICAgICAgb3V0c3RyID0gKG91dHN0cgotICAgICAgICAgICAgICAgICAgKyBzdHJpbmcuaGV4ZGlnaXRzWyhvID4+IDQpICYgMHhGXQotICAgICAgICAgICAgICAgICAgKyBzdHJpbmcuaGV4ZGlnaXRzW28gJiAweEZdKQotICAgIHByaW50KG91dHN0ciwgZW5kPScgJykKLQotCi1mcm9tIHRpbWUgaW1wb3J0IHRpbWUKLQotZGVmIG1ha2VzdHIoc3RhcnQsIGVuZCk6Ci0gICAgcmVzdWx0ID0gJycKLSAgICBmb3IgaSBpbiByYW5nZShzdGFydCwgZW5kICsgMSk6Ci0gICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGNocihpKQotCi0gICAgcmV0dXJuIHJlc3VsdAotCi0KLWRlZiBNRFRpbWVUcmlhbCgpOgotICAgIFRFU1RfQkxPQ0tfU0laRSA9IDEwMDAKLSAgICBURVNUX0JMT0NLUyA9IDEwMDAwCi0KLSAgICBURVNUX0JZVEVTID0gVEVTVF9CTE9DS19TSVpFICogVEVTVF9CTE9DS1MKLQotICAgICMgaW5pdGlhbGl6ZSB0ZXN0IGRhdGEsIG5lZWQgdGVtcG9yYXJ5IHN0cmluZyBmaWxsZXIKLQotICAgIGZpbHNpeiA9IDEgPDwgOAotICAgIGZpbGxlciA9IG1ha2VzdHIoMCwgZmlsc2l6LTEpCi0gICAgZGF0YSA9IGZpbGxlciAqIChURVNUX0JMT0NLX1NJWkUgLy8gZmlsc2l6KQotICAgIGRhdGEgPSBkYXRhICsgZmlsbGVyWzooVEVTVF9CTE9DS19TSVpFICUgZmlsc2l6KV0KLQotICAgIGRlbCBmaWxzaXosIGZpbGxlcgotCi0KLSAgICAjIHN0YXJ0IHRpbWVyCi0gICAgcHJpbnQoJ01ENSB0aW1lIHRyaWFsLiBQcm9jZXNzaW5nJywgVEVTVF9CWVRFUywgJ2NoYXJhY3RlcnMuLi4nKQotICAgIHQxID0gdGltZSgpCi0KLSAgICBtZENvbnRleHQgPSBtZDUoKQotCi0gICAgZm9yIGkgaW4gcmFuZ2UoVEVTVF9CTE9DS1MpOgotICAgICAgICBtZENvbnRleHQudXBkYXRlKGRhdGEpCi0KLSAgICBzdHIgPSBtZENvbnRleHQuZGlnZXN0KCkKLSAgICB0MiA9IHRpbWUoKQotCi0gICAgTURQcmludChzdHIpCi0gICAgcHJpbnQoJ2lzIGRpZ2VzdCBvZiB0ZXN0IGlucHV0LicpCi0gICAgcHJpbnQoJ1NlY29uZHMgdG8gcHJvY2VzcyB0ZXN0IGlucHV0OicsIHQyIC0gdDEpCi0gICAgcHJpbnQoJ0NoYXJhY3RlcnMgcHJvY2Vzc2VkIHBlciBzZWNvbmQ6JywgVEVTVF9CWVRFUyAvICh0MiAtIHQxKSkKLQotCi1kZWYgTURTdHJpbmcoc3RyKToKLSAgICBNRFByaW50KG1kNShzdHIuZW5jb2RlKCJ1dGYtOCIpKS5kaWdlc3QoKSkKLSAgICBwcmludCgnIicgKyBzdHIgKyAnIicpCi0KLQotZGVmIE1ERmlsZShmaWxlbmFtZSk6Ci0gICAgZiA9IG9wZW4oZmlsZW5hbWUsICdyYicpCi0gICAgbWRDb250ZXh0ID0gbWQ1KCkKLQotICAgIHdoaWxlIDE6Ci0gICAgICAgIGRhdGEgPSBmLnJlYWQoMTAyNCkKLSAgICAgICAgaWYgbm90IGRhdGE6Ci0gICAgICAgICAgICBicmVhawotICAgICAgICBtZENvbnRleHQudXBkYXRlKGRhdGEpCi0KLSAgICBNRFByaW50KG1kQ29udGV4dC5kaWdlc3QoKSkKLSAgICBwcmludChmaWxlbmFtZSkKLQotCi1pbXBvcnQgc3lzCi0KLWRlZiBNREZpbHRlcigpOgotICAgIG1kQ29udGV4dCA9IG1kNSgpCi0KLSAgICB3aGlsZSAxOgotICAgICAgICBkYXRhID0gc3lzLnN0ZGluLnJlYWQoMTYpLmVuY29kZSgpCi0gICAgICAgIGlmIG5vdCBkYXRhOgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgbWRDb250ZXh0LnVwZGF0ZShkYXRhKQotCi0gICAgTURQcmludChtZENvbnRleHQuZGlnZXN0KCkpCi0gICAgcHJpbnQoKQotCi0KLWRlZiBNRFRlc3RTdWl0ZSgpOgotICAgIHByaW50KCdNRDUgdGVzdCBzdWl0ZSByZXN1bHRzOicpCi0gICAgTURTdHJpbmcoJycpCi0gICAgTURTdHJpbmcoJ2EnKQotICAgIE1EU3RyaW5nKCdhYmMnKQotICAgIE1EU3RyaW5nKCdtZXNzYWdlIGRpZ2VzdCcpCi0gICAgTURTdHJpbmcobWFrZXN0cihvcmQoJ2EnKSwgb3JkKCd6JykpKQotICAgIE1EU3RyaW5nKG1ha2VzdHIob3JkKCdBJyksIG9yZCgnWicpKQotICAgICAgICAgICAgICArIG1ha2VzdHIob3JkKCdhJyksIG9yZCgneicpKQotICAgICAgICAgICAgICArIG1ha2VzdHIob3JkKCcwJyksIG9yZCgnOScpKSkKLSAgICBNRFN0cmluZygobWFrZXN0cihvcmQoJzEnKSwgb3JkKCc5JykpICsgJzAnKSAqIDgpCi0KLSAgICAjIENvbnRlbnRzIG9mIGZpbGUgZm9vIGFyZSAiYWJjIgotICAgIE1ERmlsZSgnZm9vJykKLQotCi0jIEkgZG9uJ3Qgd2FubmEgdXNlIGdldG9wdCgpLCBzaW5jZSBJIHdhbnQgdG8gdXNlIHRoZSBzYW1lIGkvZi4uLgotZGVmIG1haW4oKToKLSAgICBpZiBsZW4oYXJndikgPT0gMToKLSAgICAgICAgTURGaWx0ZXIoKQotICAgIGZvciBhcmcgaW4gYXJndlsxOl06Ci0gICAgICAgIGlmIGFyZ1s6Ml0gPT0gJy1zJzoKLSAgICAgICAgICAgIE1EU3RyaW5nKGFyZ1syOl0pCi0gICAgICAgIGVsaWYgYXJnID09ICctdCc6Ci0gICAgICAgICAgICBNRFRpbWVUcmlhbCgpCi0gICAgICAgIGVsaWYgYXJnID09ICcteCc6Ci0gICAgICAgICAgICBNRFRlc3RTdWl0ZSgpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBNREZpbGUoYXJnKQotCi1tYWluKCkKZGlmZiAtLWdpdCBhL0RlbW8vcGFyc2VyL0ZJTEVTIGIvRGVtby9wYXJzZXIvRklMRVMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjU5YTMuLjAwMDAwMDAKLS0tIGEvRGVtby9wYXJzZXIvRklMRVMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLURlbW8vcGFyc2VyCi1Eb2MvbGlicGFyc2VyLnRleAotTGliL0FTVC5weQotTGliL3N5bWJvbC5weQotTGliL3Rva2VuLnB5Ci1Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCmRpZmYgLS1naXQgYS9EZW1vL3BhcnNlci9SRUFETUUgYi9EZW1vL3BhcnNlci9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NzZkMzMuLjAwMDAwMDAKLS0tIGEvRGVtby9wYXJzZXIvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotVGhlc2UgZmlsZXMgYXJlIGZyb20gdGhlIGxhcmdlIGV4YW1wbGUgb2YgdXNpbmcgdGhlIGBwYXJzZXInIG1vZHVsZS4gIFJlZmVyCi10byB0aGUgUHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1JdCBhbHNvIGNvbnRhaW5zIGV4YW1wbGVzIGZvciB0aGUgQVNUIHBhcnNlci4KLQotRmlsZXM6Ci0tLS0tLS0KLQotCUZJTEVTCSAgICAgLS0gbGlzdCBvZiBmaWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHBhcnNlciBtb2R1bGUuCi0KLQlSRUFETUUJICAgICAtLSB0aGlzIGZpbGUuCi0KLQlleGFtcGxlLnB5ICAgLS0JbW9kdWxlIHRoYXQgdXNlcyB0aGUgYHBhcnNlcicgbW9kdWxlIHRvIGV4dHJhY3QKLQkJCWluZm9ybWF0aW9uIGZyb20gdGhlIHBhcnNlIHRyZWUgb2YgUHl0aG9uIHNvdXJjZQotCQkJY29kZS4KLQotCWRvY3N0cmluZy5weSAtLSBzYW1wbGUgc291cmNlIGZpbGUgY29udGFpbmluZyBvbmx5IGEgbW9kdWxlIGRvY3N0cmluZy4KLQotCXNpbXBsZS5weSAgICAtLSBzYW1wbGUgc291cmNlIGNvbnRhaW5pbmcgYSAic2hvcnQgZm9ybSIgZGVmaW5pdGlvbi4KLQotCXNvdXJjZS5weSAgICAtLQlzYW1wbGUgc291cmNlIGNvZGUgdXNlZCB0byBkZW1vbnN0cmF0ZSBhYmlsaXR5IHRvCi0JCQloYW5kbGUgbmVzdGVkIGNvbnN0cnVjdHMgZWFzaWx5IHVzaW5nIHRoZSBmdW5jdGlvbnMKLQkJCWFuZCBjbGFzc2VzIGluIGV4YW1wbGUucHkuCi0KLQl0ZXN0X3BhcnNlci5weSAgcHJvZ3JhbSB0byBwdXQgdGhlIHBhcnNlciBtb2R1bGUgdGhyb3VnaCBpdHMgcGFjZXMuCi0KLQl1bnBhcnNlLnB5CUFTVCAoMi41KSBiYXNlZCBleGFtcGxlIHRvIHJlY3JlYXRlIHNvdXJjZSBjb2RlCi0JCQlmcm9tIGFuIEFTVC4gVGhpcyBpcyBpbmNvbXBsZXRlOyBjb250cmlidXRpb25zCi0JCQlhcmUgd2VsY29tZS4KLQotRW5qb3khCmRpZmYgLS1naXQgYS9EZW1vL3BhcnNlci9kb2NzdHJpbmcucHkgYi9EZW1vL3BhcnNlci9kb2NzdHJpbmcucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YTI2MWIuLjAwMDAwMDAKLS0tIGEvRGVtby9wYXJzZXIvZG9jc3RyaW5nLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0iIiJTb21lIGRvY3VtZW50YXRpb24uCi0iIiIKZGlmZiAtLWdpdCBhL0RlbW8vcGFyc2VyL2V4YW1wbGUucHkgYi9EZW1vL3BhcnNlci9leGFtcGxlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmYwODgzLi4wMDAwMDAwCi0tLSBhL0RlbW8vcGFyc2VyL2V4YW1wbGUucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotIiIiU2ltcGxlIGNvZGUgdG8gZXh0cmFjdCBjbGFzcyAmIGZ1bmN0aW9uIGRvY3N0cmluZ3MgZnJvbSBhIG1vZHVsZS4KLQotVGhpcyBjb2RlIGlzIHVzZWQgYXMgYW4gZXhhbXBsZSBpbiB0aGUgbGlicmFyeSByZWZlcmVuY2UgbWFudWFsIGluIHRoZQotc2VjdGlvbiBvbiB1c2luZyB0aGUgcGFyc2VyIG1vZHVsZS4gIFJlZmVyIHRvIHRoZSBtYW51YWwgZm9yIGEgdGhvcm91Z2gKLWRpc2N1c3Npb24gb2YgdGhlIG9wZXJhdGlvbiBvZiB0aGlzIGNvZGUuCi0iIiIKLQotaW1wb3J0IG9zCi1pbXBvcnQgcGFyc2VyCi1pbXBvcnQgc3ltYm9sCi1pbXBvcnQgdG9rZW4KLWltcG9ydCB0eXBlcwotCi1mcm9tIHR5cGVzIGltcG9ydCBMaXN0VHlwZSwgVHVwbGVUeXBlCi0KLQotZGVmIGdldF9kb2NzKGZpbGVOYW1lKToKLSAgICAiIiJSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXJzZSB0cmVlIG9mIGEgc291cmNlIGZpbGUuCi0KLSAgICBmaWxlTmFtZQotICAgICAgICBOYW1lIG9mIHRoZSBmaWxlIHRvIHJlYWQgUHl0aG9uIHNvdXJjZSBjb2RlIGZyb20uCi0gICAgIiIiCi0gICAgc291cmNlID0gb3BlbihmaWxlTmFtZSkucmVhZCgpCi0gICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKG9zLnBhdGguc3BsaXRleHQoZmlsZU5hbWUpWzBdKQotICAgIGFzdCA9IHBhcnNlci5zdWl0ZShzb3VyY2UpCi0gICAgcmV0dXJuIE1vZHVsZUluZm8oYXN0LnRvdHVwbGUoKSwgYmFzZW5hbWUpCi0KLQotY2xhc3MgU3VpdGVJbmZvQmFzZToKLSAgICBfZG9jc3RyaW5nID0gJycKLSAgICBfbmFtZSA9ICcnCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdHJlZSA9IE5vbmUpOgotICAgICAgICBzZWxmLl9jbGFzc19pbmZvID0ge30KLSAgICAgICAgc2VsZi5fZnVuY3Rpb25faW5mbyA9IHt9Ci0gICAgICAgIGlmIHRyZWU6Ci0gICAgICAgICAgICBzZWxmLl9leHRyYWN0X2luZm8odHJlZSkKLQotICAgIGRlZiBfZXh0cmFjdF9pbmZvKHNlbGYsIHRyZWUpOgotICAgICAgICAjIGV4dHJhY3QgZG9jc3RyaW5nCi0gICAgICAgIGlmIGxlbih0cmVlKSA9PSAyOgotICAgICAgICAgICAgZm91bmQsIHZhcnMgPSBtYXRjaChET0NTVFJJTkdfU1RNVF9QQVRURVJOWzFdLCB0cmVlWzFdKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgZm91bmQsIHZhcnMgPSBtYXRjaChET0NTVFJJTkdfU1RNVF9QQVRURVJOLCB0cmVlWzNdKQotICAgICAgICBpZiBmb3VuZDoKLSAgICAgICAgICAgIHNlbGYuX2RvY3N0cmluZyA9IGV2YWwodmFyc1snZG9jc3RyaW5nJ10pCi0gICAgICAgICMgZGlzY292ZXIgaW5uZXIgZGVmaW5pdGlvbnMKLSAgICAgICAgZm9yIG5vZGUgaW4gdHJlZVsxOl06Ci0gICAgICAgICAgICBmb3VuZCwgdmFycyA9IG1hdGNoKENPTVBPVU5EX1NUTVRfUEFUVEVSTiwgbm9kZSkKLSAgICAgICAgICAgIGlmIGZvdW5kOgotICAgICAgICAgICAgICAgIGNzdG10ID0gdmFyc1snY29tcG91bmQnXQotICAgICAgICAgICAgICAgIGlmIGNzdG10WzBdID09IHN5bWJvbC5mdW5jZGVmOgotICAgICAgICAgICAgICAgICAgICBuYW1lID0gY3N0bXRbMl1bMV0KLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnVuY3Rpb25faW5mb1tuYW1lXSA9IEZ1bmN0aW9uSW5mbyhjc3RtdCkKLSAgICAgICAgICAgICAgICBlbGlmIGNzdG10WzBdID09IHN5bWJvbC5jbGFzc2RlZjoKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGNzdG10WzJdWzFdCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuX2NsYXNzX2luZm9bbmFtZV0gPSBDbGFzc0luZm8oY3N0bXQpCi0KLSAgICBkZWYgZ2V0X2RvY3N0cmluZyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2RvY3N0cmluZwotCi0gICAgZGVmIGdldF9uYW1lKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQotCi0gICAgZGVmIGdldF9jbGFzc19uYW1lcyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5fY2xhc3NfaW5mby5rZXlzKCkpCi0KLSAgICBkZWYgZ2V0X2NsYXNzX2luZm8oc2VsZiwgbmFtZSk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9jbGFzc19pbmZvW25hbWVdCi0KLSAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9jbGFzc19pbmZvW25hbWVdCi0gICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9mdW5jdGlvbl9pbmZvW25hbWVdCi0KLQotY2xhc3MgU3VpdGVGdW5jSW5mbzoKLSAgICAjICBNaXhpbiBjbGFzcyBwcm92aWRpbmcgYWNjZXNzIHRvIGZ1bmN0aW9uIG5hbWVzIGFuZCBpbmZvLgotCi0gICAgZGVmIGdldF9mdW5jdGlvbl9uYW1lcyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5fZnVuY3Rpb25faW5mby5rZXlzKCkpCi0KLSAgICBkZWYgZ2V0X2Z1bmN0aW9uX2luZm8oc2VsZiwgbmFtZSk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9mdW5jdGlvbl9pbmZvW25hbWVdCi0KLQotY2xhc3MgRnVuY3Rpb25JbmZvKFN1aXRlSW5mb0Jhc2UsIFN1aXRlRnVuY0luZm8pOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmVlID0gTm9uZSk6Ci0gICAgICAgIHNlbGYuX25hbWUgPSB0cmVlWzJdWzFdCi0gICAgICAgIFN1aXRlSW5mb0Jhc2UuX19pbml0X18oc2VsZiwgdHJlZSBhbmQgdHJlZVstMV0gb3IgTm9uZSkKLQotCi1jbGFzcyBDbGFzc0luZm8oU3VpdGVJbmZvQmFzZSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyZWUgPSBOb25lKToKLSAgICAgICAgc2VsZi5fbmFtZSA9IHRyZWVbMl1bMV0KLSAgICAgICAgU3VpdGVJbmZvQmFzZS5fX2luaXRfXyhzZWxmLCB0cmVlIGFuZCB0cmVlWy0xXSBvciBOb25lKQotCi0gICAgZGVmIGdldF9tZXRob2RfbmFtZXMoc2VsZik6Ci0gICAgICAgIHJldHVybiBsaXN0KHNlbGYuX2Z1bmN0aW9uX2luZm8ua2V5cygpKQotCi0gICAgZGVmIGdldF9tZXRob2RfaW5mbyhzZWxmLCBuYW1lKToKLSAgICAgICAgcmV0dXJuIHNlbGYuX2Z1bmN0aW9uX2luZm9bbmFtZV0KLQotCi1jbGFzcyBNb2R1bGVJbmZvKFN1aXRlSW5mb0Jhc2UsIFN1aXRlRnVuY0luZm8pOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmVlID0gTm9uZSwgbmFtZSA9ICI8c3RyaW5nPiIpOgotICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQotICAgICAgICBTdWl0ZUluZm9CYXNlLl9faW5pdF9fKHNlbGYsIHRyZWUpCi0gICAgICAgIGlmIHRyZWU6Ci0gICAgICAgICAgICBmb3VuZCwgdmFycyA9IG1hdGNoKERPQ1NUUklOR19TVE1UX1BBVFRFUk4sIHRyZWVbMV0pCi0gICAgICAgICAgICBpZiBmb3VuZDoKLSAgICAgICAgICAgICAgICBzZWxmLl9kb2NzdHJpbmcgPSB2YXJzWyJkb2NzdHJpbmciXQotCi0KLWRlZiBtYXRjaChwYXR0ZXJuLCBkYXRhLCB2YXJzPU5vbmUpOgotICAgICIiIk1hdGNoIGBkYXRhJyB0byBgcGF0dGVybicsIHdpdGggdmFyaWFibGUgZXh0cmFjdGlvbi4KLQotICAgIHBhdHRlcm4KLSAgICAgICAgUGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0LCBwb3NzaWJseSBjb250YWluaW5nIHZhcmlhYmxlcy4KLQotICAgIGRhdGEKLSAgICAgICAgRGF0YSB0byBiZSBjaGVja2VkIGFuZCBhZ2FpbnN0IHdoaWNoIHZhcmlhYmxlcyBhcmUgZXh0cmFjdGVkLgotCi0gICAgdmFycwotICAgICAgICBEaWN0aW9uYXJ5IG9mIHZhcmlhYmxlcyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBmb3VuZC4gIElmIG5vdAotICAgICAgICBwcm92aWRlZCwgYW4gZW1wdHkgZGljdGlvbmFyeSBpcyBjcmVhdGVkLgotCi0gICAgVGhlIGBwYXR0ZXJuJyB2YWx1ZSBtYXkgY29udGFpbiB2YXJpYWJsZXMgb2YgdGhlIGZvcm0gWyd2YXJuYW1lJ10gd2hpY2gKLSAgICBhcmUgYWxsb3dlZCB0byBtYXRjaCBhbnl0aGluZy4gIFRoZSB2YWx1ZSB0aGF0IGlzIG1hdGNoZWQgaXMgcmV0dXJuZWQgYXMKLSAgICBwYXJ0IG9mIGEgZGljdGlvbmFyeSB3aGljaCBtYXBzICd2YXJuYW1lJyB0byB0aGUgbWF0Y2hlZCB2YWx1ZS4gICd2YXJuYW1lJwotICAgIGlzIG5vdCByZXF1aXJlZCB0byBiZSBhIHN0cmluZyBvYmplY3QsIGJ1dCB1c2luZyBzdHJpbmdzIG1ha2VzIHBhdHRlcm5zCi0gICAgYW5kIHRoZSBjb2RlIHdoaWNoIHVzZXMgdGhlbSBtb3JlIHJlYWRhYmxlLgotCi0gICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHR3byB2YWx1ZXM6IGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgYSBtYXRjaAotICAgIHdhcyBmb3VuZCBhbmQgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgdmFyaWFibGUgbmFtZXMgdG8gdGhlaXIgYXNzb2NpYXRlZAotICAgIHZhbHVlcy4KLSAgICAiIiIKLSAgICBpZiB2YXJzIGlzIE5vbmU6Ci0gICAgICAgIHZhcnMgPSB7fQotICAgIGlmIHR5cGUocGF0dGVybikgaXMgTGlzdFR5cGU6ICAgICAgICMgJ3ZhcmlhYmxlcycgYXJlIFsndmFybmFtZSddCi0gICAgICAgIHZhcnNbcGF0dGVyblswXV0gPSBkYXRhCi0gICAgICAgIHJldHVybiAxLCB2YXJzCi0gICAgaWYgdHlwZShwYXR0ZXJuKSBpcyBub3QgVHVwbGVUeXBlOgotICAgICAgICByZXR1cm4gKHBhdHRlcm4gPT0gZGF0YSksIHZhcnMKLSAgICBpZiBsZW4oZGF0YSkgIT0gbGVuKHBhdHRlcm4pOgotICAgICAgICByZXR1cm4gMCwgdmFycwotICAgIGZvciBwYXR0ZXJuLCBkYXRhIGluIG1hcChOb25lLCBwYXR0ZXJuLCBkYXRhKToKLSAgICAgICAgc2FtZSwgdmFycyA9IG1hdGNoKHBhdHRlcm4sIGRhdGEsIHZhcnMpCi0gICAgICAgIGlmIG5vdCBzYW1lOgotICAgICAgICAgICAgYnJlYWsKLSAgICByZXR1cm4gc2FtZSwgdmFycwotCi0KLSMgIFRoaXMgcGF0dGVybiBpZGVudGlmaWVzIGNvbXBvdW5kIHN0YXRlbWVudHMsIGFsbG93aW5nIHRoZW0gdG8gYmUgcmVhZGlseQotIyAgZGlmZmVyZW50aWF0ZWQgZnJvbSBzaW1wbGUgc3RhdGVtZW50cy4KLSMKLUNPTVBPVU5EX1NUTVRfUEFUVEVSTiA9ICgKLSAgICBzeW1ib2wuc3RtdCwKLSAgICAoc3ltYm9sLmNvbXBvdW5kX3N0bXQsIFsnY29tcG91bmQnXSkKLSAgICApCi0KLQotIyAgVGhpcyBwYXR0ZXJuIHdpbGwgbWF0Y2ggYSAnc3RtdCcgbm9kZSB3aGljaCAqbWlnaHQqIHJlcHJlc2VudCBhIGRvY3N0cmluZzsKLSMgIGRvY3N0cmluZ3MgcmVxdWlyZSB0aGF0IHRoZSBzdGF0ZW1lbnQgd2hpY2ggcHJvdmlkZXMgdGhlIGRvY3N0cmluZyBiZSB0aGUKLSMgIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgY2xhc3Mgb3IgZnVuY3Rpb24sIHdoaWNoIHRoaXMgcGF0dGVybiBkb2VzIG5vdCBjaGVjay4KLSMKLURPQ1NUUklOR19TVE1UX1BBVFRFUk4gPSAoCi0gICAgc3ltYm9sLnN0bXQsCi0gICAgKHN5bWJvbC5zaW1wbGVfc3RtdCwKLSAgICAgKHN5bWJvbC5zbWFsbF9zdG10LAotICAgICAgKHN5bWJvbC5leHByX3N0bXQsCi0gICAgICAgKHN5bWJvbC50ZXN0bGlzdCwKLSAgICAgICAgKHN5bWJvbC50ZXN0LAotICAgICAgICAgKHN5bWJvbC5hbmRfdGVzdCwKLSAgICAgICAgICAoc3ltYm9sLm5vdF90ZXN0LAotICAgICAgICAgICAoc3ltYm9sLmNvbXBhcmlzb24sCi0gICAgICAgICAgICAoc3ltYm9sLmV4cHIsCi0gICAgICAgICAgICAgKHN5bWJvbC54b3JfZXhwciwKLSAgICAgICAgICAgICAgKHN5bWJvbC5hbmRfZXhwciwKLSAgICAgICAgICAgICAgIChzeW1ib2wuc2hpZnRfZXhwciwKLSAgICAgICAgICAgICAgICAoc3ltYm9sLmFyaXRoX2V4cHIsCi0gICAgICAgICAgICAgICAgIChzeW1ib2wudGVybSwKLSAgICAgICAgICAgICAgICAgIChzeW1ib2wuZmFjdG9yLAotICAgICAgICAgICAgICAgICAgIChzeW1ib2wucG93ZXIsCi0gICAgICAgICAgICAgICAgICAgIChzeW1ib2wuYXRvbSwKLSAgICAgICAgICAgICAgICAgICAgICh0b2tlbi5TVFJJTkcsIFsnZG9jc3RyaW5nJ10pCi0gICAgICAgICAgICAgICAgICAgICApKSkpKSkpKSkpKSkpKSkpLAotICAgICAodG9rZW4uTkVXTElORSwgJycpCi0gICAgICkpCmRpZmYgLS1naXQgYS9EZW1vL3BhcnNlci9zaW1wbGUucHkgYi9EZW1vL3BhcnNlci9zaW1wbGUucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NGUyZmUuLjAwMDAwMDAKLS0tIGEvRGVtby9wYXJzZXIvc2ltcGxlLnB5CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZGVmIGYoKTogIm1heWJlIGEgZG9jc3RyaW5nIgpkaWZmIC0tZ2l0IGEvRGVtby9wYXJzZXIvc291cmNlLnB5IGIvRGVtby9wYXJzZXIvc291cmNlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTAwNjI4Li4wMDAwMDAwCi0tLSBhL0RlbW8vcGFyc2VyL3NvdXJjZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSIiIkV4bWFwbGUgZmlsZSB0byBiZSBwYXJzZWQgZm9yIHRoZSBwYXJzZXJtb2R1bGUgZXhhbXBsZS4KLQotVGhlIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBleGlzdCBvbmx5IHRvIGV4aGliaXQgdGhlIGFiaWxpdHkKLW9mIHRoZSBoYW5kbGluZyBpbmZvcm1hdGlvbiBleHRyYWN0aW9uIGZyb20gbmVzdGVkIGRlZmluaXRpb25zIHVzaW5nIHBhcnNlCi10cmVlcy4gIFRoZXkgc2hvdWxkbid0IGludGVyZXN0IHlvdSBvdGhlcndpc2UhCi0iIiIKLQotY2xhc3MgU2ltcGxlOgotICAgICJUaGlzIGNsYXNzIGRvZXMgdmVyeSBsaXR0bGUuIgotCi0gICAgZGVmIG1ldGhvZChzZWxmKToKLSAgICAgICAgIlRoaXMgbWV0aG9kIGRvZXMgYWxtb3N0IG5vdGhpbmcuIgotICAgICAgICByZXR1cm4gMQotCi0gICAgY2xhc3MgTmVzdGVkOgotICAgICAgICAiVGhpcyBpcyBhIG5lc3RlZCBjbGFzcy4iCi0KLSAgICAgICAgZGVmIG5lc3RlZF9tZXRob2Qoc2VsZik6Ci0gICAgICAgICAgICAiTWV0aG9kIG9mIE5lc3RlZCBjbGFzcy4iCi0gICAgICAgICAgICBkZWYgbmVzdGVkX2Z1bmN0aW9uKCk6Ci0gICAgICAgICAgICAgICAgIkZ1bmN0aW9uIGluIG1ldGhvZCBvZiBOZXN0ZWQgY2xhc3MuIgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIHJldHVybiBuZXN0ZWRfZnVuY3Rpb24KLQotZGVmIGZ1bmN0aW9uKCk6Ci0gICAgIlRoaXMgZnVuY3Rpb24gbGl2ZXMgYXQgdGhlIG1vZHVsZSBsZXZlbC4iCi0gICAgcmV0dXJuIDAKZGlmZiAtLWdpdCBhL0RlbW8vcGFyc2VyL3Rlc3RfcGFyc2VyLnB5IGIvRGVtby9wYXJzZXIvdGVzdF9wYXJzZXIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmYTY2MzAuLjAwMDAwMDAKLS0tIGEvRGVtby9wYXJzZXIvdGVzdF9wYXJzZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uMwotIyAgKEZvcmNlIHRoZSBzY3JpcHQgdG8gdXNlIHRoZSBsYXRlc3QgYnVpbGQuKQotIwotIyAgdGVzdF9wYXJzZXIucHkKLQotaW1wb3J0IHBhcnNlciwgdHJhY2ViYWNrCi0KLV9udW1GYWlsZWQgPSAwCi0KLWRlZiB0ZXN0Q2h1bmsodCwgZmlsZU5hbWUpOgotICAgIGdsb2JhbCBfbnVtRmFpbGVkCi0gICAgcHJpbnQoJy0tLS0nLCBmaWxlTmFtZSwgZW5kPScgJykKLSAgICB0cnk6Ci0gICAgICAgIHN0ID0gcGFyc2VyLnN1aXRlKHQpCi0gICAgICAgIHR1cCA9IHBhcnNlci5zdDJ0dXBsZShzdCkKLSAgICAgICAgIyB0aGlzIGRpc2NhcmRzIHRoZSBmaXJzdCBTVDsgYSBodWdlIG1lbW9yeSBzYXZpbmdzIHdoZW4gcnVubmluZwotICAgICAgICAjIGFnYWluc3QgYSBsYXJnZSBzb3VyY2UgZmlsZSBsaWtlIFRraW50ZXIucHkuCi0gICAgICAgIHN0ID0gTm9uZQotICAgICAgICBuZXcgPSBwYXJzZXIudHVwbGUyc3QodHVwKQotICAgIGV4Y2VwdCBwYXJzZXIuUGFyc2VyRXJyb3IgYXMgZXJyOgotICAgICAgICBwcmludCgpCi0gICAgICAgIHByaW50KCdwYXJzZXIgbW9kdWxlIHJhaXNlZCBleGNlcHRpb24gb24gaW5wdXQgZmlsZScsIGZpbGVOYW1lICsgJzonKQotICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKLSAgICAgICAgX251bUZhaWxlZCA9IF9udW1GYWlsZWQgKyAxCi0gICAgZWxzZToKLSAgICAgICAgaWYgdHVwICE9IHBhcnNlci5zdDJ0dXBsZShuZXcpOgotICAgICAgICAgICAgcHJpbnQoKQotICAgICAgICAgICAgcHJpbnQoJ3BhcnNlciBtb2R1bGUgZmFpbGVkIG9uIGlucHV0IGZpbGUnLCBmaWxlTmFtZSkKLSAgICAgICAgICAgIF9udW1GYWlsZWQgPSBfbnVtRmFpbGVkICsgMQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQoJ28uay4nKQotCi1kZWYgdGVzdEZpbGUoZmlsZU5hbWUpOgotICAgIHQgPSBvcGVuKGZpbGVOYW1lKS5yZWFkKCkKLSAgICB0ZXN0Q2h1bmsodCwgZmlsZU5hbWUpCi0KLWRlZiB0ZXN0KCk6Ci0gICAgaW1wb3J0IHN5cwotICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KLSAgICBpZiBub3QgYXJnczoKLSAgICAgICAgaW1wb3J0IGdsb2IKLSAgICAgICAgYXJncyA9IGdsb2IuZ2xvYigiKi5weSIpCi0gICAgICAgIGFyZ3Muc29ydCgpCi0gICAgbGlzdChtYXAodGVzdEZpbGUsIGFyZ3MpKQotICAgIHN5cy5leGl0KF9udW1GYWlsZWQgIT0gMCkKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0RlbW8vcGFyc2VyL3RleGlwcmUuZGF0IGIvRGVtby9wYXJzZXIvdGV4aXByZS5kYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDAzYTYuLjAwMDAwMDAKLS0tIGEvRGVtby9wYXJzZXIvdGV4aXByZS5kYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotXGlucHV0IHRleGluZm8gICBAYyAtKi10ZXhpbmZvLSotCi1AYyAlKipzdGFydCBvZiBoZWFkZXIKLUBzZXRmaWxlbmFtZSBwYXJzZXIuaW5mbwotQHNldHRpdGxlIFB5dGhvbiBQYXJzZXIgTW9kdWxlIFJlZmVyZW5jZQotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQGZvb3Rub3Rlc3R5bGUgZW5kCi1AYyAlKiplbmQgb2YgaGVhZGVyCi0KLUBpZmluZm8KLVRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIGludGVyZmFjZXMKLXB1Ymxpc2hlZCBieSB0aGUgb3B0aW9uYWwgQGNvZGV7cGFyc2VyfSBtb2R1bGUgYW5kIGdpdmVzIGV4YW1wbGVzIG9mCi1ob3cgdGhleSBtYXkgYmUgdXNlZC4gIEl0IGNvbnRhaW5zIHRoZSBzYW1lIHRleHQgYXMgdGhlIGNoYXB0ZXIgb24gdGhlCi1AY29kZXtwYXJzZXJ9IG1vZHVsZSBpbiB0aGUgQGNpdGV7UHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlfSwgYnV0IGlzCi1wcmVzZW50ZWQgYXMgYSBzZXBhcmF0ZSBkb2N1bWVudC4KLQotQ29weXJpZ2h0IDE5OTUtMTk5NiBieSBGcmVkIEwuIERyYWtlLCBKci4sIFJlc3RvbiwgVmlyZ2luaWEsIFVTQSwgYW5kCi1WaXJnaW5pYSBQb2x5dGVjaG5pYyBJbnN0aXR1dGUgYW5kIFN0YXRlIFVuaXZlcnNpdHksIEJsYWNrc2J1cmcsCi1WaXJnaW5pYSwgVVNBLiAgUG9ydGlvbnMgb2YgdGhlIHNvZnR3YXJlIGNvcHlyaWdodCAxOTkxLTE5OTUgYnkKLVN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bSwgQW1zdGVyZGFtLCBUaGUgTmV0aGVybGFuZHMuICBDb3B5aW5nIGlzCi1wZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFpbiBQeXRob24gZGlzdHJpYnV0aW9uLAotd2l0aCB0aGUgYWRkaXRpb25hbCByZXN0cmljdGlvbiB0aGF0IHRoaXMgYWRkaXRpb25hbCBub3RpY2UgYmUgaW5jbHVkZWQKLWFuZCBtYWludGFpbmVkIG9uIGFsbCBkaXN0cmlidXRlZCBjb3BpZXMuCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCi1wcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLXN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIEZyZWQgTC4gRHJha2UsIEpyLiBhbmQKLVZpcmdpbmlhIFBvbHl0ZWNobmljIEluc3RpdHV0ZSBhbmQgU3RhdGUgVW5pdmVyc2l0eSBub3QgYmUgdXNlZCBpbgotYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgotCi1GUkVEIEwuIERSQUtFLCBKUi4gQU5EIFZJUkdJTklBIFBPTFlURUNITklDIElOU1RJVFVURSBBTkQgU1RBVEUKLVVOSVZFUlNJVFkgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLUlOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLUVWRU5UIFNIQUxMIEZSRUQgTC4gRFJBS0UsIEpSLiBPUiBWSVJHSU5JQSBQT0xZVEVDSE5JQyBJTlNUSVRVVEUgQU5ECi1TVEFURSBVTklWRVJTSVRZIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwKLURBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgotUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLVRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLVBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi1AZW5kIGlmaW5mbwotCi1AdGl0bGVwYWdlCi1AdGl0bGUgUHl0aG9uIFBhcnNlciBNb2R1bGUgUmVmZXJlbmNlCi1AYXV0aG9yIEZyZWQgTC4gRHJha2UsIEpyLgotCi1AYyAgVGhlIGZvbGxvd2luZyB0d28gY29tbWFuZHMgc3RhcnQgdGhlIGNvcHlyaWdodCBwYWdlLgotQHBhZ2UKLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCAxOTk1LTE5OTYgYnkgRnJlZCBMLiBEcmFrZSwgSnIuLCBSZXN0b24sIFZpcmdpbmlhLCBVU0EsIGFuZAotVmlyZ2luaWEgUG9seXRlY2huaWMgSW5zdGl0dXRlIGFuZCBTdGF0ZSBVbml2ZXJzaXR5LCBCbGFja3NidXJnLAotVmlyZ2luaWEsIFVTQS4gIFBvcnRpb25zIG9mIHRoZSBzb2Z0d2FyZSBjb3B5cmlnaHQgMTk5MS0xOTk1IGJ5Ci1TdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0sIEFtc3RlcmRhbSwgVGhlIE5ldGhlcmxhbmRzLiAgQ29weWluZyBpcwotcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1haW4gUHl0aG9uIGRpc3RyaWJ1dGlvbiwKLXdpdGggdGhlIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb24gdGhhdCB0aGlzIGFkZGl0aW9uYWwgbm90aWNlIGJlIGluY2x1ZGVkCi1hbmQgbWFpbnRhaW5lZCBvbiBhbGwgZGlzdHJpYnV0ZWQgY29waWVzLgotCi1AY2VudGVyIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLQotUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi1kb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCi1wcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0Ci1ib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KLXN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIEZyZWQgTC4gRHJha2UsIEpyLiBhbmQKLVZpcmdpbmlhIFBvbHl0ZWNobmljIEluc3RpdHV0ZSBhbmQgU3RhdGUgVW5pdmVyc2l0eSBub3QgYmUgdXNlZCBpbgotYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZQotd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgotCi1GUkVEIEwuIERSQUtFLCBKUi4gQU5EIFZJUkdJTklBIFBPTFlURUNITklDIElOU1RJVFVURSBBTkQgU1RBVEUKLVVOSVZFUlNJVFkgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKLUlOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KLUVWRU5UIFNIQUxMIEZSRUQgTC4gRFJBS0UsIEpSLiBPUiBWSVJHSU5JQSBQT0xZVEVDSE5JQyBJTlNUSVRVVEUgQU5ECi1TVEFURSBVTklWRVJTSVRZIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwKLURBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgotUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKLVRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKLVBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi1AZW5kIHRpdGxlcGFnZQotCi0KLUBub2RlIFRvcCwgT3ZlcnZpZXcsIChkaXIpLCAoZGlyKQotQHRvcCBUaGUgUHl0aG9uIFBhcnNlciBNb2R1bGUKLQotQGlmaW5mbwotVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgaW50ZXJmYWNlcwotcHVibGlzaGVkIGJ5IHRoZSBvcHRpb25hbCBAY29kZXtwYXJzZXJ9IG1vZHVsZSBhbmQgZ2l2ZXMgZXhhbXBsZXMgb2YKLWhvdyB0aGV5IG1heSBiZSB1c2VkLiAgSXQgY29udGFpbnMgdGhlIHNhbWUgdGV4dCBhcyB0aGUgY2hhcHRlciBvbiB0aGUKLUBjb2Rle3BhcnNlcn0gbW9kdWxlIGluIHRoZSBAY2l0ZXtQeXRob24gTGlicmFyeSBSZWZlcmVuY2V9LCBidXQgaXMKLXByZXNlbnRlZCBhcyBhIHNlcGFyYXRlIGRvY3VtZW50LgotCi1UaGlzIHZlcnNpb24gY29ycmVzcG9uZHMgdG8gUHl0aG9uIHZlcnNpb24gMS40ICgxIFNlcHQuIDE5OTYpLgotCi1AZW5kIGlmaW5mbwotCi1AYyBwbGFjZWhvbGRlciBmb3IgdGhlIG1hc3RlciBtZW51IC0tIHBhdGNoZWQgYnkgdGV4aW5mby1hbGwtbWVudXMtdXBkYXRlCi1AbWVudQotQGVuZCBtZW51CmRpZmYgLS1naXQgYS9EZW1vL3B5c3ZyL01ha2VmaWxlIGIvRGVtby9weXN2ci9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiOWYzZS4uMDAwMDAwMAotLS0gYS9EZW1vL3B5c3ZyL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgJ3B5c3ZyJyBhcHBsaWNhdGlvbiBlbWJlZGRpbmcgUHl0aG9uLgotIyBUYWlsb3JlZCBmb3IgUHl0aG9uIDEuNWEzIG9yIGxhdGVyLgotIyBTb21lIGRldGFpbHMgYXJlIHNwZWNpZmljIGZvciBTb2xhcmlzIG9yIENOUkkuCi0jIEFsc28gc2VlICMjIGNvbW1lbnRzIGZvciB0YWlsb3JpbmcuCi0KLSMgV2hpY2ggQyBjb21waWxlcgotQ0M9Z2NjCi0jI1BVUklGWT0vdXNyL2xvY2FsL3B1cmUvcHVyaWZ5Ci1MSU5LQ0M9JChQVVJJRlkpICQoQ0MpCi0KLSMgT3B0aW1pemF0aW9uIHByZWZlcmVuY2VzCi1PUFQ9LWcKLQotIyBXaGljaCBQeXRob24gdmVyc2lvbiB3ZSdyZSB1c2luZwotVkVSPTIuMgotCi0jIEV4cHJlc3Npb25zIHVzaW5nIHRoZSBhYm92ZSBkZWZpbml0aW9ucwotUFlWRVI9cHl0aG9uJChWRVIpCi0KLSMgVXNlIHRoZXNlIGRlZnMgd2hlbiBjb21waWxpbmcgYWdhaW5zdCBpbnN0YWxsZWQgUHl0aG9uCi0jI0lOU1Q9L3Vzci9sb2NhbAotIyNQWUM9JChJTlNUKS9saWIvJChQWVZFUikvY29uZmlnCi0jI1BZSU5DTD0tSSQoSU5TVCkvaW5jbHVkZS8kKFBZVkVSKSAtSSQoUFlDKQotIyNQWUxJQlM9JChQWUMpL2xpYiQoUFlWRVIpLmEKLQotIyBVc2UgdGhlc2UgZGVmcyB3aGVuIGNvbXBpbGluZyBhZ2FpbnN0IGJ1aWx0IFB5dGhvbgotUExBVD1saW51eAotUFlJTkNMPS1JLi4vLi4vSW5jbHVkZSAtSS4uLy4uLyQoUExBVCkKLVBZTElCUz0uLi8uLi8kKFBMQVQpL2xpYiQoUFlWRVIpLmEKLQotIyBMaWJyYXJpZXMgdG8gbGluayB3aXRoIC0tIHZlcnkgaW5zdGFsbGF0aW9uIGRlcGVuZGVudAotIyAoU2VlIExJQlM9IGluIE1vZHVsZXMvTWFrZWZpbGUgaW4gYnVpbGQgdHJlZSkKLVJMTElCUz0tbHJlYWRsaW5lIC1sdGVybWNhcAotT1RIRVJMSUJTPS1sbnNsIC1scHRocmVhZCAtbGRsIC1sbSAtbGRiIC1sdXRpbAotCi0jIENvbXBpbGF0aW9uIGFuZCBsaW5rIGZsYWdzIC0tIG5vIG5lZWQgdG8gY2hhbmdlIG5vcm1hbGx5Ci1DRkxBR1M9JChPUFQpCi1DUFBGTEFHUz0kKFBZSU5DTCkKLUxJQlM9JChQWUxJQlMpICQoUkxMSUJTKSAkKE9USEVSTElCUykKLQotIyBEZWZhdWx0IHBvcnQgZm9yIHRoZSBweXN2ciBhcHBsaWNhdGlvbgotUE9SVD00MDAwCi0KLSMgRGVmYXVsdCB0YXJnZXQKLWFsbDogcHlzdnIKLQotIyBUYXJnZXQgdG8gYnVpbGQgcHlzdnIKLXB5c3ZyOiBweXN2ci5vICQoUFlPQkpTKSAkKFBZTElCUykKLQkkKExJTktDQykgcHlzdnIubyAkKExJQlMpIC1vIHB5c3ZyCi0KLSMgVGFyZ2V0IHRvIGJ1aWxkIGFuZCBydW4gcHlzdnIKLXJ1bjogcHlzdnIKLQlweXN2ciAkKFBPUlQpCi0KLSMgVGFyZ2V0IHRvIGNsZWFuIHVwIHRoZSBkaXJlY3RvcnkKLWNsZWFuOgotCS1ybSAtZiBweXN2ciAqLm8gKn4gY29yZQpkaWZmIC0tZ2l0IGEvRGVtby9weXN2ci9SRUFETUUgYi9EZW1vL3B5c3ZyL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU2NGUzOC4uMDAwMDAwMAotLS0gYS9EZW1vL3B5c3ZyL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgbXVsdGktdGhyZWFkZWQgQyBhcHBsaWNhdGlvbiBlbWJlZGRpbmcgYQotUHl0aG9uIGludGVycHJldGVyLgotCi1UaGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBpcyBhIG11bHRpLXRocmVhZGVkIHRlbG5ldC1saWtlIHNlcnZlciB0aGF0Ci1wcm92aWRlcyB5b3Ugd2l0aCBhIFB5dGhvbiBwcm9tcHQgKGluc3RlYWQgb2YgYSBzaGVsbCBwcm9tcHQpLgotCi1UaGUgZmlsZSBweXN2ci5weSBpcyBhIHByb3RvdHlwZSBpbiBQeXRob24uCi0KLVRISVMgQVBQTElDQVRJT04gSVMgTk9UIFNFQ1VSRSAtLSBPTkxZIFVTRSBJVCBGT1IgVEVTVElORyEKZGlmZiAtLWdpdCBhL0RlbW8vcHlzdnIvcHlzdnIuYyBiL0RlbW8vcHlzdnIvcHlzdnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2Y2QyYS4uMDAwMDAwMAotLS0gYS9EZW1vL3B5c3ZyL3B5c3ZyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyogQSBtdWx0aS10aHJlYWRlZCB0ZWxuZXQtbGlrZSBzZXJ2ZXIgdGhhdCBnaXZlcyBhIFB5dGhvbiBwcm9tcHQuCi0KLVVzYWdlOiBweXN2ciBbcG9ydF0KLQotRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGl0IG9ubHkgYWNjZXB0cyByZXF1ZXN0cyBmcm9tIHRoZSBjdXJyZW50IGhvc3QuCi1UaGlzIGNhbiBzdGlsbCBiZSBpbnNlY3VyZSwgYnV0IHJlc3RyaWN0cyB2aW9sYXRpb25zIGZyb20gcGVvcGxlIHdobwotY2FuIGxvZyBpbiBvbiB5b3VyIG1hY2hpbmUuICBVc2Ugd2l0aCBjYXV0aW9uIQotCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotCi0vKiBYWFggVW1wZmguCi0gICBQeXRob24uaCBkZWZpbmVzIGEgdHlwZWRlZiBkZXN0cnVjdG9yLCB3aGljaCBjb25mbGljdHMgd2l0aCBwdGhyZWFkLmguCi0gICBTbyBQeXRob24uaCBtdXN0IGJlIGluY2x1ZGVkIGFmdGVyIHB0aHJlYWQuaC4gKi8KLQotI2luY2x1ZGUgIlB5dGhvbi5oIgotCi1leHRlcm4gaW50IFB5X1ZlcmJvc2VGbGFnOwotCi0jaWZuZGVmIFBPUlQKLSNkZWZpbmUgUE9SVCA0MDAwCi0jZW5kaWYKLQotc3RydWN0IHdvcmtvcmRlciB7Ci0gICAgaW50IGNvbm47Ci0gICAgc3RydWN0IHNvY2thZGRyX2luIGFkZHI7Ci19OwotCi0vKiBGb3J3YXJkICovCi1zdGF0aWMgdm9pZCBpbml0X3B5dGhvbih2b2lkKTsKLXN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpOwotc3RhdGljIHZvaWQgb3Byb2duYW1lKHZvaWQpOwotc3RhdGljIHZvaWQgbWFpbl90aHJlYWQoaW50KTsKLXN0YXRpYyB2b2lkIGNyZWF0ZV90aHJlYWQoaW50LCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKik7Ci1zdGF0aWMgdm9pZCAqc2VydmljZV90aHJlYWQoc3RydWN0IHdvcmtvcmRlciAqKTsKLXN0YXRpYyB2b2lkIHJ1bl9pbnRlcnByZXRlcihGSUxFICosIEZJTEUgKik7Ci1zdGF0aWMgaW50IHJ1bl9jb21tYW5kKGNoYXIgKiwgUHlPYmplY3QgKik7Ci1zdGF0aWMgdm9pZCBwcyh2b2lkKTsKLQotc3RhdGljIGNoYXIgKnByb2duYW1lID0gInB5c3ZyIjsKLQotc3RhdGljIFB5VGhyZWFkU3RhdGUgKmd0c3RhdGU7Ci0KLW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCBwb3J0ID0gUE9SVDsKLSAgICBpbnQgYzsKLQotICAgIGlmIChhcmdjID4gMCAmJiBhcmd2WzBdICE9IE5VTEwgJiYgYXJndlswXVswXSAhPSAnXDAnKQotICAgICAgICBwcm9nbmFtZSA9IGFyZ3ZbMF07Ci0KLSAgICB3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgInYiKSkgIT0gRU9GKSB7Ci0gICAgICAgIHN3aXRjaCAoYykgewotICAgICAgICBjYXNlICd2JzoKLSAgICAgICAgICAgIFB5X1ZlcmJvc2VGbGFnKys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAob3B0aW5kIDwgYXJnYykgewotICAgICAgICBpZiAob3B0aW5kKzEgPCBhcmdjKSB7Ci0gICAgICAgICAgICBvcHJvZ25hbWUoKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidG9vIG1hbnkgYXJndW1lbnRzXG4iKTsKLSAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcG9ydCA9IGF0b2koYXJndltvcHRpbmRdKTsKLSAgICAgICAgaWYgKHBvcnQgPD0gMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJiYWQgcG9ydCAoJXMpXG4iLCBhcmd2W29wdGluZF0pOwotICAgICAgICAgICAgdXNhZ2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1haW5fdGhyZWFkKHBvcnQpOwotCi0gICAgZnByaW50ZihzdGRlcnIsICJCeWUuXG4iKTsKLQotICAgIGV4aXQoMCk7Ci19Ci0KLXN0YXRpYyBjaGFyIHVzYWdlX2xpbmVbXSA9ICJ1c2FnZTogJXMgW3BvcnRdXG4iOwotCi1zdGF0aWMgdm9pZAotdXNhZ2Uodm9pZCkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgdXNhZ2VfbGluZSwgcHJvZ25hbWUpOwotICAgIGV4aXQoMik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tYWluX3RocmVhZChpbnQgcG9ydCkKLXsKLSAgICBpbnQgc29jaywgY29ubiwgc2l6ZSwgaTsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkciwgY2xpZW50YWRkcjsKLQotICAgIHNvY2sgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIDApOwotICAgIGlmIChzb2NrIDwgMCkgewotICAgICAgICBvcHJvZ25hbWUoKTsKLSAgICAgICAgcGVycm9yKCJjYW4ndCBjcmVhdGUgc29ja2V0Iik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0jaWZkZWYgU09fUkVVU0VBRERSCi0gICAgaSA9IDE7Ci0gICAgc2V0c29ja29wdChzb2NrLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsIChjaGFyICopICZpLCBzaXplb2YgaSk7Ci0jZW5kaWYKLQotICAgIG1lbXNldCgoY2hhciAqKSZhZGRyLCAnXDAnLCBzaXplb2YgYWRkcik7Ci0gICAgYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7Ci0gICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSAwTDsKLSAgICBpZiAoYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZiBhZGRyKSA8IDApIHsKLSAgICAgICAgb3Byb2duYW1lKCk7Ci0gICAgICAgIHBlcnJvcigiY2FuJ3QgYmluZCBzb2NrZXQgdG8gYWRkcmVzcyIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGlmIChsaXN0ZW4oc29jaywgNSkgPCAwKSB7Ci0gICAgICAgIG9wcm9nbmFtZSgpOwotICAgICAgICBwZXJyb3IoImNhbid0IGxpc3RlbiBvbiBzb2NrZXQiKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIkxpc3RlbmluZyBvbiBwb3J0ICVkLi4uXG4iLCBwb3J0KTsKLQotICAgIGZvciAoaSA9IDA7IDsgaSsrKSB7Ci0gICAgICAgIHNpemUgPSBzaXplb2YgY2xpZW50YWRkcjsKLSAgICAgICAgbWVtc2V0KChjaGFyICopICZjbGllbnRhZGRyLCAnXDAnLCBzaXplKTsKLSAgICAgICAgY29ubiA9IGFjY2VwdChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZjbGllbnRhZGRyLCAmc2l6ZSk7Ci0gICAgICAgIGlmIChjb25uIDwgMCkgewotICAgICAgICAgICAgb3Byb2duYW1lKCk7Ci0gICAgICAgICAgICBwZXJyb3IoImNhbid0IGFjY2VwdCBjb25uZWN0aW9uIGZyb20gc29ja2V0Iik7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZSA9IHNpemVvZiBhZGRyOwotICAgICAgICBtZW1zZXQoKGNoYXIgKikgJmFkZHIsICdcMCcsIHNpemUpOwotICAgICAgICBpZiAoZ2V0c29ja25hbWUoY29ubiwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmc2l6ZSkgPCAwKSB7Ci0gICAgICAgICAgICBvcHJvZ25hbWUoKTsKLSAgICAgICAgICAgIHBlcnJvcigiY2FuJ3QgZ2V0IHNvY2tldCBuYW1lIG9mIGNvbm5lY3Rpb24iKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNsaWVudGFkZHIuc2luX2FkZHIuc19hZGRyICE9IGFkZHIuc2luX2FkZHIuc19hZGRyKSB7Ci0gICAgICAgICAgICBvcHJvZ25hbWUoKTsKLSAgICAgICAgICAgIHBlcnJvcigiY29ubmVjdGlvbiBmcm9tIG5vbi1sb2NhbCBob3N0IHJlZnVzZWQiKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKGFkZHI9JWx4LCBjbGllbnRhZGRyPSVseClcbiIsCi0gICAgICAgICAgICAgICAgbnRvaGwoYWRkci5zaW5fYWRkci5zX2FkZHIpLAotICAgICAgICAgICAgICAgIG50b2hsKGNsaWVudGFkZHIuc2luX2FkZHIuc19hZGRyKSk7Ci0gICAgICAgICAgICBjbG9zZShjb25uKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpID09IDQpIHsKLSAgICAgICAgICAgIGNsb3NlKGNvbm4pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3JlYXRlX3RocmVhZChjb25uLCAmY2xpZW50YWRkcik7Ci0gICAgfQotCi0gICAgY2xvc2Uoc29jayk7Ci0KLSAgICBpZiAoZ3RzdGF0ZSkgewotICAgICAgICBQeUV2YWxfQWNxdWlyZVRocmVhZChndHN0YXRlKTsKLSAgICAgICAgZ3RzdGF0ZSA9IE5VTEw7Ci0gICAgICAgIFB5X0ZpbmFsaXplKCk7Ci0gICAgICAgIC8qIEFuZCBhIHNlY29uZCB0aW1lLCBqdXN0IGJlY2F1c2Ugd2UgY2FuLiAqLwotICAgICAgICBQeV9GaW5hbGl6ZSgpOyAvKiBUaGlzIHNob3VsZCBiZSBoYXJtbGVzcy4gKi8KLSAgICB9Ci0gICAgZXhpdCgwKTsKLX0KLQotc3RhdGljIHZvaWQKLWNyZWF0ZV90aHJlYWQoaW50IGNvbm4sIHN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcikKLXsKLSAgICBzdHJ1Y3Qgd29ya29yZGVyICp3b3JrOwotICAgIHB0aHJlYWRfdCB0ZGF0YTsKLQotICAgIHdvcmsgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB3b3Jrb3JkZXIpKTsKLSAgICBpZiAod29yayA9PSBOVUxMKSB7Ci0gICAgICAgIG9wcm9nbmFtZSgpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm91dCBvZiBtZW1vcnkgZm9yIHRocmVhZC5cbiIpOwotICAgICAgICBjbG9zZShjb25uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB3b3JrLT5jb25uID0gY29ubjsKLSAgICB3b3JrLT5hZGRyID0gKmFkZHI7Ci0KLSAgICBpbml0X3B5dGhvbigpOwotCi0gICAgaWYgKHB0aHJlYWRfY3JlYXRlKCZ0ZGF0YSwgTlVMTCwgKHZvaWQgKilzZXJ2aWNlX3RocmVhZCwgd29yaykgPCAwKSB7Ci0gICAgICAgIG9wcm9nbmFtZSgpOwotICAgICAgICBwZXJyb3IoImNhbid0IGNyZWF0ZSBuZXcgdGhyZWFkIik7Ci0gICAgICAgIGNsb3NlKGNvbm4pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHB0aHJlYWRfZGV0YWNoKHRkYXRhKSA8IDApIHsKLSAgICAgICAgb3Byb2duYW1lKCk7Ci0gICAgICAgIHBlcnJvcigiY2FuJ3QgZGV0YWNoIGZyb20gdGhyZWFkIik7Ci0gICAgfQotfQotCi1zdGF0aWMgUHlUaHJlYWRTdGF0ZSAqdGhlX3RzdGF0ZTsKLXN0YXRpYyBQeUludGVycHJldGVyU3RhdGUgKnRoZV9pbnRlcnA7Ci1zdGF0aWMgUHlPYmplY3QgKnRoZV9idWlsdGluczsKLQotc3RhdGljIHZvaWQKLWluaXRfcHl0aG9uKHZvaWQpCi17Ci0gICAgaWYgKGd0c3RhdGUpCi0gICAgICAgIHJldHVybjsKLSAgICBQeV9Jbml0aWFsaXplKCk7IC8qIEluaXRpYWxpemUgdGhlIGludGVycHJldGVyICovCi0gICAgUHlFdmFsX0luaXRUaHJlYWRzKCk7IC8qIENyZWF0ZSAoYW5kIGFjcXVpcmUpIHRoZSBpbnRlcnByZXRlciBsb2NrICovCi0gICAgZ3RzdGF0ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7IC8qIFJlbGVhc2UgdGhlIHRocmVhZCBzdGF0ZSAqLwotfQotCi1zdGF0aWMgdm9pZCAqCi1zZXJ2aWNlX3RocmVhZChzdHJ1Y3Qgd29ya29yZGVyICp3b3JrKQotewotICAgIEZJTEUgKmlucHV0LCAqb3V0cHV0OwotCi0gICAgZnByaW50ZihzdGRlcnIsICJTdGFydCB0aHJlYWQgZm9yIGNvbm5lY3Rpb24gJWQuXG4iLCB3b3JrLT5jb25uKTsKLQotICAgIHBzKCk7Ci0KLSAgICBpbnB1dCA9IGZkb3Blbih3b3JrLT5jb25uLCAiciIpOwotICAgIGlmIChpbnB1dCA9PSBOVUxMKSB7Ci0gICAgICAgIG9wcm9nbmFtZSgpOwotICAgICAgICBwZXJyb3IoImNhbid0IGNyZWF0ZSBpbnB1dCBzdHJlYW0iKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLQotICAgIG91dHB1dCA9IGZkb3Blbih3b3JrLT5jb25uLCAidyIpOwotICAgIGlmIChvdXRwdXQgPT0gTlVMTCkgewotICAgICAgICBvcHJvZ25hbWUoKTsKLSAgICAgICAgcGVycm9yKCJjYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSIpOwotICAgICAgICBmY2xvc2UoaW5wdXQpOwotICAgICAgICBnb3RvIGRvbmU7Ci0gICAgfQotCi0gICAgc2V0dmJ1ZihpbnB1dCwgTlVMTCwgX0lPTkJGLCAwKTsKLSAgICBzZXR2YnVmKG91dHB1dCwgTlVMTCwgX0lPTkJGLCAwKTsKLQotICAgIHJ1bl9pbnRlcnByZXRlcihpbnB1dCwgb3V0cHV0KTsKLQotICAgIGZjbG9zZShpbnB1dCk7Ci0gICAgZmNsb3NlKG91dHB1dCk7Ci0KLSAgZG9uZToKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkVuZCB0aHJlYWQgZm9yIGNvbm5lY3Rpb24gJWQuXG4iLCB3b3JrLT5jb25uKTsKLSAgICBjbG9zZSh3b3JrLT5jb25uKTsKLSAgICBmcmVlKHdvcmspOwotfQotCi1zdGF0aWMgdm9pZAotb3Byb2duYW1lKHZvaWQpCi17Ci0gICAgaW50IHNhdmUgPSBlcnJubzsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9nbmFtZSk7Ci0gICAgZXJybm8gPSBzYXZlOwotfQotCi1zdGF0aWMgdm9pZAotcnVuX2ludGVycHJldGVyKEZJTEUgKmlucHV0LCBGSUxFICpvdXRwdXQpCi17Ci0gICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwotICAgIFB5T2JqZWN0ICpuZXdfc3RkaW4sICpuZXdfc3Rkb3V0OwotICAgIFB5T2JqZWN0ICptYWlubW9kLCAqZ2xvYmFsczsKLSAgICBjaGFyIGJ1ZmZlclsxMDAwXTsKLSAgICBjaGFyICpwLCAqcTsKLSAgICBpbnQgbiwgZW5kOwotCi0gICAgUHlFdmFsX0FjcXVpcmVMb2NrKCk7Ci0gICAgdHN0YXRlID0gUHlfTmV3SW50ZXJwcmV0ZXIoKTsKLSAgICBpZiAodHN0YXRlID09IE5VTEwpIHsKLSAgICAgICAgZnByaW50ZihvdXRwdXQsICJTb3JyeSAtLSBjYW4ndCBjcmVhdGUgYW4gaW50ZXJwcmV0ZXJcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbWFpbm1vZCA9IFB5SW1wb3J0X0FkZE1vZHVsZSgiX19tYWluX18iKTsKLSAgICBnbG9iYWxzID0gUHlNb2R1bGVfR2V0RGljdChtYWlubW9kKTsKLSAgICBQeV9JTkNSRUYoZ2xvYmFscyk7Ci0KLSAgICBuZXdfc3RkaW4gPSBQeUZpbGVfRnJvbUZpbGUoaW5wdXQsICI8c29ja2V0LWluPiIsICJyIiwgTlVMTCk7Ci0gICAgbmV3X3N0ZG91dCA9IFB5RmlsZV9Gcm9tRmlsZShvdXRwdXQsICI8c29ja2V0LW91dD4iLCAidyIsIE5VTEwpOwotCi0gICAgUHlTeXNfU2V0T2JqZWN0KCJzdGRpbiIsIG5ld19zdGRpbik7Ci0gICAgUHlTeXNfU2V0T2JqZWN0KCJzdGRvdXQiLCBuZXdfc3Rkb3V0KTsKLSAgICBQeVN5c19TZXRPYmplY3QoInN0ZGVyciIsIG5ld19zdGRvdXQpOwotCi0gICAgZm9yIChuID0gMTsgIVB5RXJyX09jY3VycmVkKCk7IG4rKykgewotICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCi0gICAgICAgIGZwcmludGYob3V0cHV0LCAiJWQ+ICIsIG4pOwotICAgICAgICBwID0gZmdldHMoYnVmZmVyLCBzaXplb2YgYnVmZmVyLCBpbnB1dCk7Ci0gICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCi0KLSAgICAgICAgaWYgKHAgPT0gTlVMTCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAocFswXSA9PSAnXDM3NycgJiYgcFsxXSA9PSAnXDM1NCcpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBxID0gc3RycmNocihwLCAnXHInKTsKLSAgICAgICAgaWYgKHEgJiYgcVsxXSA9PSAnXG4nICYmIHFbMl0gPT0gJ1wwJykgewotICAgICAgICAgICAgKnErKyA9ICdcbic7Ci0gICAgICAgICAgICAqcSsrID0gJ1wwJzsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlICgqcCAmJiBpc3NwYWNlKCpwKSkKLSAgICAgICAgICAgIHArKzsKLSAgICAgICAgaWYgKHBbMF0gPT0gJyMnIHx8IHBbMF0gPT0gJ1wwJykKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGVuZCA9IHJ1bl9jb21tYW5kKGJ1ZmZlciwgZ2xvYmFscyk7Ci0gICAgICAgIGlmIChlbmQgPCAwKQotICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLQotICAgICAgICBpZiAoZW5kKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgUHlfWERFQ1JFRihnbG9iYWxzKTsKLSAgICBQeV9YREVDUkVGKG5ld19zdGRpbik7Ci0gICAgUHlfWERFQ1JFRihuZXdfc3Rkb3V0KTsKLQotICAgIFB5X0VuZEludGVycHJldGVyKHRzdGF0ZSk7Ci0gICAgUHlFdmFsX1JlbGVhc2VMb2NrKCk7Ci0KLSAgICBmcHJpbnRmKG91dHB1dCwgIkdvb2RieWUhXG4iKTsKLX0KLQotc3RhdGljIGludAotcnVuX2NvbW1hbmQoY2hhciAqYnVmZmVyLCBQeU9iamVjdCAqZ2xvYmFscykKLXsKLSAgICBQeU9iamVjdCAqbSwgKmQsICp2OwotICAgIGZwcmludGYoc3RkZXJyLCAicnVuX2NvbW1hbmQ6ICVzIiwgYnVmZmVyKTsKLSAgICBpZiAoc3RyY2hyKGJ1ZmZlciwgJ1xuJykgPT0gTlVMTCkKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICAgIHYgPSBQeVJ1bl9TdHJpbmcoYnVmZmVyLCBQeV9zaW5nbGVfaW5wdXQsIGdsb2JhbHMsIGdsb2JhbHMpOwotICAgIGlmICh2ID09IE5VTEwpIHsKLSAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkgPT0gUHlFeGNfU3lzdGVtRXhpdCkgewotICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBQeV9ERUNSRUYodik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcyh2b2lkKQotewotICAgIGNoYXIgYnVmZmVyWzEwMF07Ci0gICAgUHlPU19zbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLAotICAgICAgICAgICAgICAgICAgInBzIC1sIC1wICVkIDwvZGV2L251bGwgfCBzZWQgMWRcbiIsIGdldHBpZCgpKTsKLSAgICBzeXN0ZW0oYnVmZmVyKTsKLX0KZGlmZiAtLWdpdCBhL0RlbW8vcHlzdnIvcHlzdnIucHkgYi9EZW1vL3B5c3ZyL3B5c3ZyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NzhlOTljLi4wMDAwMDAwCi0tLSBhL0RlbW8vcHlzdnIvcHlzdnIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbjMKLQotIiIiQSBtdWx0aS10aHJlYWRlZCB0ZWxuZXQtbGlrZSBzZXJ2ZXIgdGhhdCBnaXZlcyBhIFB5dGhvbiBwcm9tcHQuCi0KLVRoaXMgaXMgcmVhbGx5IGEgcHJvdG90eXBlIGZvciB0aGUgc2FtZSB0aGluZyBpbiBDLgotCi1Vc2FnZTogcHlzdnIucHkgW3BvcnRdCi0KLUZvciBzZWN1cml0eSByZWFzb25zLCBpdCBvbmx5IGFjY2VwdHMgcmVxdWVzdHMgZnJvbSB0aGUgY3VycmVudCBob3N0LgotVGhpcyBjYW4gc3RpbGwgYmUgaW5zZWN1cmUsIGJ1dCByZXN0cmljdHMgdmlvbGF0aW9ucyBmcm9tIHBlb3BsZSB3aG8KLWNhbiBsb2cgaW4gb24geW91ciBtYWNoaW5lLiAgVXNlIHdpdGggY2F1dGlvbiEKLQotIiIiCi0KLWltcG9ydCBzeXMsIG9zLCBzdHJpbmcsIGdldG9wdCwgX3RocmVhZCwgc29ja2V0LCB0cmFjZWJhY2sKLQotUE9SVCA9IDQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRGVmYXVsdCBwb3J0Ci0KLWRlZiBtYWluKCk6Ci0gICAgdHJ5OgotICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICIiKQotICAgICAgICBpZiBsZW4oYXJncykgPiAxOgotICAgICAgICAgICAgcmFpc2UgZ2V0b3B0LmVycm9yKCJUb28gbWFueSBhcmd1bWVudHMuIikKLSAgICBleGNlcHQgZ2V0b3B0LmVycm9yIGFzIG1zZzoKLSAgICAgICAgdXNhZ2UobXNnKQotICAgIGZvciBvLCBhIGluIG9wdHM6Ci0gICAgICAgIHBhc3MKLSAgICBpZiBhcmdzOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBwb3J0ID0gc3RyaW5nLmF0b2koYXJnc1swXSkKLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgbXNnOgotICAgICAgICAgICAgdXNhZ2UobXNnKQotICAgIGVsc2U6Ci0gICAgICAgIHBvcnQgPSBQT1JUCi0gICAgbWFpbl90aHJlYWQocG9ydCkKLQotZGVmIHVzYWdlKG1zZz1Ob25lKToKLSAgICBzeXMuc3Rkb3V0ID0gc3lzLnN0ZGVycgotICAgIGlmIG1zZzoKLSAgICAgICAgcHJpbnQobXNnKQotICAgIHByaW50KCJcbiIsIF9fZG9jX18sIGVuZD0nICcpCi0gICAgc3lzLmV4aXQoMikKLQotZGVmIG1haW5fdGhyZWFkKHBvcnQpOgotICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCi0gICAgc29jay5iaW5kKCgiIiwgcG9ydCkpCi0gICAgc29jay5saXN0ZW4oNSkKLSAgICBwcmludCgiTGlzdGVuaW5nIG9uIHBvcnQiLCBwb3J0LCAiLi4uIikKLSAgICB3aGlsZSAxOgotICAgICAgICAoY29ubiwgYWRkcikgPSBzb2NrLmFjY2VwdCgpCi0gICAgICAgIGlmIGFkZHJbMF0gIT0gY29ubi5nZXRzb2NrbmFtZSgpWzBdOgotICAgICAgICAgICAgY29ubi5jbG9zZSgpCi0gICAgICAgICAgICBwcmludCgiUmVmdXNpbmcgY29ubmVjdGlvbiBmcm9tIG5vbi1sb2NhbCBob3N0IiwgYWRkclswXSwgIi4iKQotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkKHNlcnZpY2VfdGhyZWFkLCAoY29ubiwgYWRkcikpCi0gICAgICAgIGRlbCBjb25uLCBhZGRyCi0KLWRlZiBzZXJ2aWNlX3RocmVhZChjb25uLCBhZGRyKToKLSAgICAoY2FkZHIsIGNwb3J0KSA9IGFkZHIKLSAgICBwcmludCgiVGhyZWFkICVzIGhhcyBjb25uZWN0aW9uIGZyb20gJXMuXG4iICUgKHN0cihfdGhyZWFkLmdldF9pZGVudCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhZGRyKSwgZW5kPScgJykKLSAgICBzdGRpbiA9IGNvbm4ubWFrZWZpbGUoInIiKQotICAgIHN0ZG91dCA9IGNvbm4ubWFrZWZpbGUoInciLCAwKQotICAgIHJ1bl9pbnRlcnByZXRlcihzdGRpbiwgc3Rkb3V0KQotICAgIHByaW50KCJUaHJlYWQgJXMgaXMgZG9uZS5cbiIgJSBzdHIoX3RocmVhZC5nZXRfaWRlbnQoKSksIGVuZD0nICcpCi0KLWRlZiBydW5faW50ZXJwcmV0ZXIoc3RkaW4sIHN0ZG91dCk6Ci0gICAgZ2xvYmFscyA9IHt9Ci0gICAgdHJ5OgotICAgICAgICBzdHIoc3lzLnBzMSkKLSAgICBleGNlcHQ6Ci0gICAgICAgIHN5cy5wczEgPSAiPj4+ICIKLSAgICBzb3VyY2UgPSAiIgotICAgIHdoaWxlIDE6Ci0gICAgICAgIHN0ZG91dC53cml0ZShzeXMucHMxKQotICAgICAgICBsaW5lID0gc3RkaW4ucmVhZGxpbmUoKQotICAgICAgICBpZiBsaW5lWzoyXSA9PSAnXDM3N1wzNTQnOgotICAgICAgICAgICAgbGluZSA9ICIiCi0gICAgICAgIGlmIG5vdCBsaW5lIGFuZCBub3Qgc291cmNlOgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgaWYgbGluZVstMjpdID09ICdcclxuJzoKLSAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMl0gKyAnXG4nCi0gICAgICAgIHNvdXJjZSA9IHNvdXJjZSArIGxpbmUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgY29kZSA9IGNvbXBpbGVfY29tbWFuZChzb3VyY2UpCi0gICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlcnI6Ci0gICAgICAgICAgICBzb3VyY2UgPSAiIgotICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4Y2VwdGlvbihTeW50YXhFcnJvciwgZXJyLCBOb25lLCBmaWxlPXN0ZG91dCkKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGlmIG5vdCBjb2RlOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgc291cmNlID0gIiIKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcnVuX2NvbW1hbmQoY29kZSwgc3RkaW4sIHN0ZG91dCwgZ2xvYmFscykKLSAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQgYXMgaG93OgotICAgICAgICAgICAgaWYgaG93OgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgaG93ID0gc3RyKGhvdykKLSAgICAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgICAgIGhvdyA9ICIiCi0gICAgICAgICAgICAgICAgc3Rkb3V0LndyaXRlKCJFeGl0ICVzXG4iICUgaG93KQotICAgICAgICAgICAgYnJlYWsKLSAgICBzdGRvdXQud3JpdGUoIlxuR29vZGJ5ZS5cbiIpCi0KLWRlZiBydW5fY29tbWFuZChjb2RlLCBzdGRpbiwgc3Rkb3V0LCBnbG9iYWxzKToKLSAgICBzYXZlID0gc3lzLnN0ZGluLCBzeXMuc3Rkb3V0LCBzeXMuc3RkZXJyCi0gICAgdHJ5OgotICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLnN0ZGVyciA9IHN0ZG91dAotICAgICAgICBzeXMuc3RkaW4gPSBzdGRpbgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBleGVjKGNvZGUsIGdsb2JhbHMpCi0gICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0IGFzIGhvdzoKLSAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQoaG93KS53aXRoX3RyYWNlYmFjayhzeXMuZXhjX2luZm8oKVsyXSkKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgdHlwZSwgdmFsdWUsIHRiID0gc3lzLmV4Y19pbmZvKCkKLSAgICAgICAgICAgIGlmIHRiOiB0YiA9IHRiLnRiX25leHQKLSAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGNlcHRpb24odHlwZSwgdmFsdWUsIHRiKQotICAgICAgICAgICAgZGVsIHRiCi0gICAgZmluYWxseToKLSAgICAgICAgc3lzLnN0ZGluLCBzeXMuc3Rkb3V0LCBzeXMuc3RkZXJyID0gc2F2ZQotCi1mcm9tIGNvZGUgaW1wb3J0IGNvbXBpbGVfY29tbWFuZAotCi1tYWluKCkKZGlmZiAtLWdpdCBhL0RlbW8vcnBjL01BTklGRVNUIGIvRGVtby9ycGMvTUFOSUZFU1QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NWYzZWIuLjAwMDAwMDAKLS0tIGEvRGVtby9ycGMvTUFOSUZFU1QKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0gICBGaWxlIE5hbWUJCUFyY2hpdmUgIwlEZXNjcmlwdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBNQU5JRkVTVCAgICAgICAgICAgICAgICAgICAxCVRoaXMgc2hpcHBpbmcgbGlzdAotIFJFQURNRSAgICAgICAgICAgICAgICAgICAgIDEJCi0gVC5weSAgICAgICAgICAgICAgICAgICAgICAgMQkKLSBtb3VudGNsaWVudC5weSAgICAgICAgICAgICAxCQotIG5mc2NsaWVudC5weSAgICAgICAgICAgICAgIDEJCi0gcnBjLnB5ICAgICAgICAgICAgICAgICAgICAgMQkKLSB0ZXN0ICAgICAgICAgICAgICAgICAgICAgICAxCi0geGRyLnB5ICAgICAgICAgICAgICAgICAgICAgMQkKZGlmZiAtLWdpdCBhL0RlbW8vcnBjL1JFQURNRSBiL0RlbW8vcnBjL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5NDhhMy4uMDAwMDAwMAotLS0gYS9EZW1vL3JwYy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1UaGlzIGlzIGEgUHl0aG9uIGludGVyZmFjZSB0byBTdW4gUlBDLCBkZXNpZ25lZCBhbmQgaW1wbGVtZW50ZWQgbW9zdGx5Ci1ieSByZWFkaW5nIHRoZSBJbnRlcm5ldCBSRkNzIGFib3V0IHRoZSBzdWJqZWN0LgotCi0qKiogTk9URTogeGRyLnB5IGhhcyBldm9sdmVkIGludG8gdGhlIHN0YW5kYXJkIG1vZHVsZSB4ZHJsaWIucHkgKioqCi0KLVRoZXJlIGFyZSB0d28gbGlicmFyeSBtb2R1bGVzLCB4ZHIucHkgYW5kIHJwYy5weSwgYW5kIHNldmVyYWwgZXhhbXBsZQotY2xpZW50czogbW91bnRjbGllbnQucHksIG5mc2NsaWVudC5weSwgYW5kIHJudXNlcnNjbGllbnQucHksCi1pbXBsZW1lbnRpbmcgdGhlIE5GUyBNb3VudCBwcm90b2NvbCwgKHBhcnQgb2YpIHRoZSBORlMgcHJvdG9jb2wsIGFuZAotdGhlICJybnVzZXJzIiBwcm90b2NvbCAodXNlZCBieSBydXNlcnMoMSkpLCByZXNwZWN0aXZlbHkuICBUaGUgbGF0dGVyCi1kZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBicm9hZGNhc3QgdmlhIHRoZSBQb3J0IG1hcHBlcidzIENBTExJVAotcHJvY2VkdXJlLgotCi1UaGVyZSBpcyBhbHNvIGEgd2F5IHRvIGNyZWF0ZSBzZXJ2ZXJzIGluIFB5dGhvbi4KLQotVG8gdGVzdCB0aGUgbmZzIGNsaWVudCwgcnVuIGl0IGZyb20gdGhlIHNoZWxsIHdpdGggc29tZXRoaW5nIGxpa2UgdGhpczoKLQotICBweXRob24gLWMgJ2ltcG9ydCBuZnNjbGllbnQ7IG5mc2NsaWVudC50ZXN0KCknIFtob3N0bmFtZSBbZmlsZXN5c3RlbW5hbWVdXQotCi1XaGVuIGNhbGxlZCB3aXRob3V0IGEgZmlsZXN5c3RlbW5hbWUsIGl0IGxpc3RzIHRoZSBmaWxlc3lzdGVtcyBhdCB0aGUKLWhvc3Q7IGRlZmF1bHQgaG9zdCBpcyB0aGUgbG9jYWwgbWFjaGluZS4KLQotT3RoZXIgY2xpZW50cyBhcmUgdGVzdGVkIHNpbWlsYXJseS4KLQotRm9yIGhvc3RuYW1lLCB1c2UgZS5nLiB3dWFyY2hpdmUud3VzdGwuZWR1IG9yIGdhdGVrZWVwZXIuZGVjLmNvbSAodHdvCi1ob3N0cyB0aGF0IGFyZSBrbm93biB0byBleHBvcnQgTkZTIGZpbGVzeXN0ZW1zIHdpdGggbGl0dGxlIHJlc3RyaWN0aW9ucykuCi0KLVRoZXJlIGFyZSBub3cgdHdvIGRpZmZlcmVudCBSUEMgY29tcGlsZXJzOgotCi0xKSBXaW0gTGV3aXMgcnBjZ2VuLnB5IGZvdW5kIG9uIGh0dHA6Ly93d3cub21uaWdyb3VwLmNvbS9+d2ltbC9zb2Z0L3N0YWxlLWluZGV4Lmh0bWwjcHl0aG9uLiAKLQotMikgUGV0ZXIgxXN0cmFuZHMgcnBjZ2VuLnB5LCB3aGljaCBpcyBwYXJ0IG9mICJweW5mcyIgKGh0dHA6Ly93d3cuY2VuZGlvLnNlL35wZXRlci9weW5mcy8pLiAKZGlmZiAtLWdpdCBhL0RlbW8vcnBjL1QucHkgYi9EZW1vL3JwYy9ULnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzI1NTA3Li4wMDAwMDAwCi0tLSBhL0RlbW8vcnBjL1QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIFNpbXBsZSBpbnRlcmZhY2UgdG8gcmVwb3J0IGV4ZWN1dGlvbiB0aW1lcyBvZiBwcm9ncmFtIGZyYWdtZW50cy4KLSMgQ2FsbCBUU1RBUlQoKSB0byByZXNldCB0aGUgdGltZXIsIFRTVE9QKC4uLikgdG8gcmVwb3J0IHRpbWVzLgotCi1pbXBvcnQgc3lzLCBvcywgdGltZQotCi1kZWYgVFNUQVJUKCk6Ci0gICAgZ2xvYmFsIHQwLCB0MQotICAgIHUsIHMsIGN1LCBjcyA9IG9zLnRpbWVzKCkKLSAgICB0MCA9IHUrY3UsIHMrY3MsIHRpbWUudGltZSgpCi0KLWRlZiBUU1RPUCgqbGFiZWwpOgotICAgIGdsb2JhbCB0MCwgdDEKLSAgICB1LCBzLCBjdSwgY3MgPSBvcy50aW1lcygpCi0gICAgdDEgPSB1K2N1LCBzK2NzLCB0aW1lLnRpbWUoKQotICAgIHR0ID0gW10KLSAgICBmb3IgaSBpbiByYW5nZSgzKToKLSAgICAgICAgdHQuYXBwZW5kKHQxW2ldIC0gdDBbaV0pCi0gICAgW3UsIHMsIHJdID0gdHQKLSAgICBtc2cgPSAnJwotICAgIGZvciB4IGluIGxhYmVsOiBtc2cgPSBtc2cgKyAoeCArICcgJykKLSAgICBtc2cgPSBtc2cgKyAnJXIgdXNlciwgJXIgc3lzLCAlciByZWFsXG4nICUgKHUsIHMsIHIpCi0gICAgc3lzLnN0ZGVyci53cml0ZShtc2cpCmRpZmYgLS1naXQgYS9EZW1vL3JwYy9tb3VudGNsaWVudC5weSBiL0RlbW8vcnBjL21vdW50Y2xpZW50LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTc5N2RmLi4wMDAwMDAwCi0tLSBhL0RlbW8vcnBjL21vdW50Y2xpZW50LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLSMgTW91bnQgUlBDIGNsaWVudCAtLSBSRkMgMTA5NCAoTkZTKSwgQXBwZW5kaXggQQotCi0jIFRoaXMgbW9kdWxlIGRlbW9uc3RyYXRlcyBob3cgdG8gd3JpdGUgeW91ciBvd24gUlBDIGNsaWVudCBpbiBQeXRob24uCi0jIFdoZW4gdGhpcyBleGFtcGxlIHdhcyB3cml0dGVuLCB0aGVyZSB3YXMgbm8gUlBDIGNvbXBpbGVyIGZvcgotIyBQeXRob24uIFdpdGhvdXQgc3VjaCBhIGNvbXBpbGVyLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgY2xhc3NlcwotIyBkZXJpdmVkIGZyb20gUGFja2VyIGFuZCBVbnBhY2tlciB0byBoYW5kbGUgdGhlIGRhdGEgdHlwZXMgZm9yIHRoZQotIyBzZXJ2ZXIgeW91IHdhbnQgdG8gaW50ZXJmYWNlIHRvLiAgWW91IHRoZW4gd3JpdGUgdGhlIGNsaWVudCBjbGFzcy4KLSMgSWYgeW91IHdhbnQgdG8gc3VwcG9ydCBib3RoIHRoZSBUQ1AgYW5kIHRoZSBVRFAgdmVyc2lvbiBvZiBhCi0jIHByb3RvY29sLCB1c2UgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYXMgc2hvd24gYmVsb3cuCi0KLQotaW1wb3J0IHJwYwotZnJvbSBycGMgaW1wb3J0IFBhY2tlciwgVW5wYWNrZXIsIFRDUENsaWVudCwgVURQQ2xpZW50Ci0KLQotIyBQcm9ncmFtIG51bWJlciBhbmQgdmVyc2lvbiBmb3IgdGhlIG1vdW50IHByb3RvY29sCi1NT1VOVFBST0cgPSAxMDAwMDUKLU1PVU5UVkVSUyA9IDEKLQotIyBTaXplIG9mIHRoZSAnZmhhbmRsZScgb3BhcXVlIHN0cnVjdHVyZQotRkhTSVpFID0gMzIKLQotCi0jIFBhY2tlciBkZXJpdmVkIGNsYXNzIGZvciBNb3VudCBwcm90b2NvbCBjbGllbnRzLgotIyBUaGUgb25seSB0aGluZyB3ZSBuZWVkIHRvIHBhY2sgYmV5b25kIGJhc2ljIHR5cGVzIGlzIGFuICdmaGFuZGxlJwotCi1jbGFzcyBNb3VudFBhY2tlcihQYWNrZXIpOgotCi0gICAgZGVmIHBhY2tfZmhhbmRsZShzZWxmLCBmaGFuZGxlKToKLSAgICAgICAgc2VsZi5wYWNrX2ZvcGFxdWUoRkhTSVpFLCBmaGFuZGxlKQotCi0KLSMgVW5wYWNrZXIgZGVyaXZlZCBjbGFzcyBmb3IgTW91bnQgcHJvdG9jb2wgY2xpZW50cy4KLSMgVGhlIGltcG9ydGFudCB0eXBlcyB3ZSBuZWVkIHRvIHVucGFjayBhcmUgZmhhbmRsZSwgZmhzdGF0dXMsCi0jIG1vdW50bGlzdCBhbmQgZXhwb3J0bGlzdDsgbW91bnRzdHJ1Y3QsIGV4cG9ydHN0cnVjdCBhbmQgZ3JvdXBzIGFyZQotIyB1c2VkIHRvIHVucGFjayBjb21wb25lbnRzIG9mIG1vdW50bGlzdCBhbmQgZXhwb3J0bGlzdCBhbmQgdGhlCi0jIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zIGFyZSBwYXNzZWQgYXMgZnVuY3Rpb24gYXJndW1lbnQgdG8gdGhlCi0jIGdlbmVyaWMgdW5wYWNrX2xpc3QgZnVuY3Rpb24uCi0KLWNsYXNzIE1vdW50VW5wYWNrZXIoVW5wYWNrZXIpOgotCi0gICAgZGVmIHVucGFja19maGFuZGxlKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi51bnBhY2tfZm9wYXF1ZShGSFNJWkUpCi0KLSAgICBkZWYgdW5wYWNrX2Zoc3RhdHVzKHNlbGYpOgotICAgICAgICBzdGF0dXMgPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgaWYgc3RhdHVzID09IDA6Ci0gICAgICAgICAgICBmaCA9IHNlbGYudW5wYWNrX2ZoYW5kbGUoKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgZmggPSBOb25lCi0gICAgICAgIHJldHVybiBzdGF0dXMsIGZoCi0KLSAgICBkZWYgdW5wYWNrX21vdW50bGlzdChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYudW5wYWNrX2xpc3Qoc2VsZi51bnBhY2tfbW91bnRzdHJ1Y3QpCi0KLSAgICBkZWYgdW5wYWNrX21vdW50c3RydWN0KHNlbGYpOgotICAgICAgICBob3N0bmFtZSA9IHNlbGYudW5wYWNrX3N0cmluZygpCi0gICAgICAgIGRpcmVjdG9yeSA9IHNlbGYudW5wYWNrX3N0cmluZygpCi0gICAgICAgIHJldHVybiAoaG9zdG5hbWUsIGRpcmVjdG9yeSkKLQotICAgIGRlZiB1bnBhY2tfZXhwb3J0bGlzdChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYudW5wYWNrX2xpc3Qoc2VsZi51bnBhY2tfZXhwb3J0c3RydWN0KQotCi0gICAgZGVmIHVucGFja19leHBvcnRzdHJ1Y3Qoc2VsZik6Ci0gICAgICAgIGZpbGVzeXMgPSBzZWxmLnVucGFja19zdHJpbmcoKQotICAgICAgICBncm91cHMgPSBzZWxmLnVucGFja19ncm91cHMoKQotICAgICAgICByZXR1cm4gKGZpbGVzeXMsIGdyb3VwcykKLQotICAgIGRlZiB1bnBhY2tfZ3JvdXBzKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi51bnBhY2tfbGlzdChzZWxmLnVucGFja19zdHJpbmcpCi0KLQotIyBUaGVzZSBhcmUgdGhlIHByb2NlZHVyZXMgc3BlY2lmaWMgdG8gdGhlIE1vdW50IGNsaWVudCBjbGFzcy4KLSMgVGhpbmsgb2YgdGhpcyBhcyBhIGRlcml2ZWQgY2xhc3Mgb2YgZWl0aGVyIFRDUENsaWVudCBvciBVRFBDbGllbnQuCi0KLWNsYXNzIFBhcnRpYWxNb3VudENsaWVudDoKLQotICAgICMgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IENsaWVudC5fX2luaXRfXyB0byBpbml0aWFsaXplCi0gICAgIyBzZWxmLnBhY2tlciBhbmQgc2VsZi51bnBhY2tlcgotICAgIGRlZiBhZGRwYWNrZXJzKHNlbGYpOgotICAgICAgICBzZWxmLnBhY2tlciA9IE1vdW50UGFja2VyKCkKLSAgICAgICAgc2VsZi51bnBhY2tlciA9IE1vdW50VW5wYWNrZXIoJycpCi0KLSAgICAjIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBDbGllbnQuX19pbml0X18gdG8gYmluZCB0aGUgc29ja2V0Ci0gICAgIyB0byBhIHBhcnRpY3VsYXIgbmV0d29yayBpbnRlcmZhY2UgYW5kIHBvcnQuICBXZSB1c2UgdGhlCi0gICAgIyBkZWZhdWx0IG5ldHdvcmsgaW50ZXJmYWNlLCBidXQgaWYgd2UncmUgcnVubmluZyBhcyByb290LAotICAgICMgd2Ugd2FudCB0byBiaW5kIHRvIGEgcmVzZXJ2ZWQgcG9ydAotICAgIGRlZiBiaW5kc29ja2V0KHNlbGYpOgotICAgICAgICBpbXBvcnQgb3MKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdWlkID0gb3MuZ2V0dWlkKCkKLSAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgdWlkID0gMQotICAgICAgICBpZiB1aWQgPT0gMDoKLSAgICAgICAgICAgIHBvcnQgPSBycGMuYmluZHJlc3Zwb3J0KHNlbGYuc29jaywgJycpCi0gICAgICAgICAgICAjICdwb3J0JyBpcyBub3QgdXNlZAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5zb2NrLmJpbmQoKCcnLCAwKSkKLQotICAgICMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gY291Z2ggdXAgYSBzdWl0YWJsZQotICAgICMgYXV0aGVudGljYXRpb24gb2JqZWN0IGZvciBhIGNhbGwgdG8gcHJvY2VkdXJlICdwcm9jJy4KLSAgICBkZWYgbWtjcmVkKHNlbGYpOgotICAgICAgICBpZiBzZWxmLmNyZWQgaXMgTm9uZToKLSAgICAgICAgICAgIHNlbGYuY3JlZCA9IHJwYy5BVVRIX1VOSVgsIHJwYy5tYWtlX2F1dGhfdW5peF9kZWZhdWx0KCkKLSAgICAgICAgcmV0dXJuIHNlbGYuY3JlZAotCi0gICAgIyBUaGUgbWV0aG9kcyBNbnQsIER1bXAgZXRjLiBlYWNoIGltcGxlbWVudCBvbmUgUmVtb3RlCi0gICAgIyBQcm9jZWR1cmUgQ2FsbC4gIFRoaXMgaXMgZG9uZSBieSBjYWxsaW5nIHNlbGYubWFrZV9jYWxsKCkKLSAgICAjIHdpdGggYXMgYXJndW1lbnRzOgotICAgICMKLSAgICAjIC0gdGhlIHByb2NlZHVyZSBudW1iZXIKLSAgICAjIC0gdGhlIGFyZ3VtZW50cyAob3IgTm9uZSkKLSAgICAjIC0gdGhlICJwYWNrZXIiIGZ1bmN0aW9uIGZvciB0aGUgYXJndW1lbnRzIChvciBOb25lKQotICAgICMgLSB0aGUgInVucGFja2VyIiBmdW5jdGlvbiBmb3IgdGhlIHJldHVybiB2YWx1ZSAob3IgTm9uZSkKLSAgICAjCi0gICAgIyBUaGUgcGFja2VyIGFuZCB1bnBhY2tlciBmdW5jdGlvbiwgaWYgbm90IE5vbmUsICptdXN0KiBiZQotICAgICMgbWV0aG9kcyBvZiBzZWxmLnBhY2tlciBhbmQgc2VsZi51bnBhY2tlciwgcmVzcGVjdGl2ZWx5LgotICAgICMgQSB2YWx1ZSBvZiBOb25lIG1lYW5zIHRoYXQgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cyBvciBpcyBubwotICAgICMgcmV0dXJuIHZhbHVlLCByZXNwZWN0aXZlbHkuCi0gICAgIwotICAgICMgVGhlIHJldHVybiB2YWx1ZSBmcm9tIG1ha2VfY2FsbCgpIGlzIHRoZSByZXR1cm4gdmFsdWUgZnJvbQotICAgICMgdGhlIHJlbW90ZSBwcm9jZWR1cmUgY2FsbCwgYXMgdW5wYWNrZWQgYnkgdGhlICJ1bnBhY2tlciIKLSAgICAjIGZ1bmN0aW9uLCBvciBOb25lIGlmIHRoZSB1bnBhY2tlciBmdW5jdGlvbiBpcyBOb25lLgotICAgICMKLSAgICAjIChFdmVuIGlmIHlvdSBleHBlY3QgYSByZXN1bHQgb2YgTm9uZSwgeW91IHNob3VsZCBzdGlsbAotICAgICMgcmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBtYWtlX2NhbGwoKSwgc2luY2UgdGhpcyBtYXkgYmUKLSAgICAjIG5lZWRlZCBieSBhIGJyb2FkY2FzdGluZyB2ZXJzaW9uIG9mIHRoZSBjbGFzcy4pCi0gICAgIwotICAgICMgSWYgdGhlIGNhbGwgZmFpbHMsIG1ha2VfY2FsbCgpIHJhaXNlcyBhbiBleGNlcHRpb24KLSAgICAjICh0aGlzIGluY2x1ZGVzIHRpbWUtb3V0cyBhbmQgaW52YWxpZCByZXN1bHRzKS4KLSAgICAjCi0gICAgIyBOb3RlIHRoYXQgKGF0IGxlYXN0IHdpdGggdGhlIFVEUCBwcm90b2NvbCkgdGhlcmUgaXMgbm8KLSAgICAjIGd1YXJhbnRlZSB0aGF0IGEgY2FsbCBpcyBleGVjdXRlZCBhdCBtb3N0IG9uY2UuICBXaGVuIHlvdSBkbwotICAgICMgZ2V0IGEgcmVwbHksIHlvdSBrbm93IGl0IGhhcyBiZWVuIGV4ZWN1dGVkIGF0IGxlYXN0IG9uY2U7Ci0gICAgIyB3aGVuIHlvdSBkb24ndCBnZXQgYSByZXBseSwgeW91IGtub3cgbm90aGluZy4KLQotICAgIGRlZiBNbnQoc2VsZiwgZGlyZWN0b3J5KToKLSAgICAgICAgcmV0dXJuIHNlbGYubWFrZV9jYWxsKDEsIGRpcmVjdG9yeSwgXAotICAgICAgICAgICAgICAgIHNlbGYucGFja2VyLnBhY2tfc3RyaW5nLCBcCi0gICAgICAgICAgICAgICAgc2VsZi51bnBhY2tlci51bnBhY2tfZmhzdGF0dXMpCi0KLSAgICBkZWYgRHVtcChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYubWFrZV9jYWxsKDIsIE5vbmUsIFwKLSAgICAgICAgICAgICAgICBOb25lLCBzZWxmLnVucGFja2VyLnVucGFja19tb3VudGxpc3QpCi0KLSAgICBkZWYgVW1udChzZWxmLCBkaXJlY3RvcnkpOgotICAgICAgICByZXR1cm4gc2VsZi5tYWtlX2NhbGwoMywgZGlyZWN0b3J5LCBcCi0gICAgICAgICAgICAgICAgc2VsZi5wYWNrZXIucGFja19zdHJpbmcsIE5vbmUpCi0KLSAgICBkZWYgVW1udGFsbChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYubWFrZV9jYWxsKDQsIE5vbmUsIE5vbmUsIE5vbmUpCi0KLSAgICBkZWYgRXhwb3J0KHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5tYWtlX2NhbGwoNSwgTm9uZSwgXAotICAgICAgICAgICAgICAgIE5vbmUsIHNlbGYudW5wYWNrZXIudW5wYWNrX2V4cG9ydGxpc3QpCi0KLQotIyBXZSB0dXJuIHRoZSBwYXJ0aWFsIE1vdW50IGNsaWVudCBpbnRvIGEgZnVsbCBvbmUgZm9yIGVpdGhlciBwcm90b2NvbAotIyBieSB1c2Ugb2YgbXVsdGlwbGUgaW5oZXJpdGFuY2UuICAoSW4gZ2VuZXJhbCwgd2hlbiBjbGFzcyBDIGhhcyBiYXNlCi0jIGNsYXNzZXMgQjEuLi5CbiwgaWYgeCBpcyBhbiBpbnN0YW5jZSBvZiBjbGFzcyBDLCBtZXRob2RzIG9mIHggYXJlCi0jIHNlYXJjaGVkIGZpcnN0IGluIEMsIHRoZW4gaW4gQjEsIHRoZW4gaW4gQjIsIC4uLiwgZmluYWxseSBpbiBCbi4pCi0KLWNsYXNzIFRDUE1vdW50Q2xpZW50KFBhcnRpYWxNb3VudENsaWVudCwgVENQQ2xpZW50KToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0KToKLSAgICAgICAgVENQQ2xpZW50Ll9faW5pdF9fKHNlbGYsIGhvc3QsIE1PVU5UUFJPRywgTU9VTlRWRVJTKQotCi0KLWNsYXNzIFVEUE1vdW50Q2xpZW50KFBhcnRpYWxNb3VudENsaWVudCwgVURQQ2xpZW50KToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0KToKLSAgICAgICAgVURQQ2xpZW50Ll9faW5pdF9fKHNlbGYsIGhvc3QsIE1PVU5UUFJPRywgTU9VTlRWRVJTKQotCi0KLSMgQSBsaXR0bGUgdGVzdCBwcm9ncmFtIGZvciB0aGUgTW91bnQgY2xpZW50LiAgVGhpcyB0YWtlcyBhIGhvc3QgYXMKLSMgY29tbWFuZCBsaW5lIGFyZ3VtZW50IChkZWZhdWx0IHRoZSBsb2NhbCBtYWNoaW5lKSwgcHJpbnRzIGl0cyBleHBvcnQKLSMgbGlzdCwgYW5kIGF0dGVtcHRzIHRvIG1vdW50IGFuZCB1bm1vdW50IGVhY2ggZXhwb3J0ZWQgZmlsZXMgc3lzdGVtLgotIyBBbiBvcHRpb25hbCBmaXJzdCBhcmd1bWVudCBvZiAtdCBvciAtdSBzcGVjaWZpZXMgdGhlIHByb3RvY29sIHRvIHVzZQotIyAoVENQIG9yIFVEUCksIGRlZmF1bHQgaXMgVURQLgotCi1kZWYgdGVzdCgpOgotICAgIGltcG9ydCBzeXMKLSAgICBpZiBzeXMuYXJndlsxOl0gYW5kIHN5cy5hcmd2WzFdID09ICctdCc6Ci0gICAgICAgIEMgPSBUQ1BNb3VudENsaWVudAotICAgICAgICBkZWwgc3lzLmFyZ3ZbMV0KLSAgICBlbGlmIHN5cy5hcmd2WzE6XSBhbmQgc3lzLmFyZ3ZbMV0gPT0gJy11JzoKLSAgICAgICAgQyA9IFVEUE1vdW50Q2xpZW50Ci0gICAgICAgIGRlbCBzeXMuYXJndlsxXQotICAgIGVsc2U6Ci0gICAgICAgIEMgPSBVRFBNb3VudENsaWVudAotICAgIGlmIHN5cy5hcmd2WzE6XTogaG9zdCA9IHN5cy5hcmd2WzFdCi0gICAgZWxzZTogaG9zdCA9ICcnCi0gICAgbWNsID0gQyhob3N0KQotICAgIGxpc3QgPSBtY2wuRXhwb3J0KCkKLSAgICBmb3IgaXRlbSBpbiBsaXN0OgotICAgICAgICBwcmludChpdGVtKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBtY2wuTW50KGl0ZW1bMF0pCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHByaW50KCdTb3JyeScpCi0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBtY2wuVW1udChpdGVtWzBdKQpkaWZmIC0tZ2l0IGEvRGVtby9ycGMvbmZzY2xpZW50LnB5IGIvRGVtby9ycGMvbmZzY2xpZW50LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjkxY2UwLi4wMDAwMDAwCi0tLSBhL0RlbW8vcnBjL25mc2NsaWVudC5weQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0jIE5GUyBSUEMgY2xpZW50IC0tIFJGQyAxMDk0Ci0KLSMgWFhYIFRoaXMgaXMgbm90IHlldCBjb21wbGV0ZS4KLSMgWFhYIE9ubHkgR0VUQVRUUiwgU0VUVFRSLCBMT09LVVAgYW5kIFJFQURESVIgYXJlIHN1cHBvcnRlZC4KLQotIyAoU2VlIG1vdW50Y2xpZW50LnB5IGZvciBzb21lIGhpbnRzIG9uIGhvdyB0byB3cml0ZSBSUEMgY2xpZW50cyBpbgotIyBQeXRob24gaW4gZ2VuZXJhbCkKLQotaW1wb3J0IHJwYwotZnJvbSBycGMgaW1wb3J0IFVEUENsaWVudCwgVENQQ2xpZW50Ci1mcm9tIG1vdW50Y2xpZW50IGltcG9ydCBGSFNJWkUsIE1vdW50UGFja2VyLCBNb3VudFVucGFja2VyCi0KLU5GU19QUk9HUkFNID0gMTAwMDAzCi1ORlNfVkVSU0lPTiA9IDIKLQotIyBlbnVtIHN0YXQKLU5GU19PSyA9IDAKLSMgKC4uLm1hbnkgZXJyb3IgdmFsdWVzLi4uKQotCi0jIGVudW0gZnR5cGUKLU5GTk9OID0gMAotTkZSRUcgPSAxCi1ORkRJUiA9IDIKLU5GQkxLID0gMwotTkZDSFIgPSA0Ci1ORkxOSyA9IDUKLQotCi1jbGFzcyBORlNQYWNrZXIoTW91bnRQYWNrZXIpOgotCi0gICAgZGVmIHBhY2tfc2F0dHJhcmdzKHNlbGYsIHNhKToKLSAgICAgICAgZmlsZSwgYXR0cmlidXRlcyA9IHNhCi0gICAgICAgIHNlbGYucGFja19maGFuZGxlKGZpbGUpCi0gICAgICAgIHNlbGYucGFja19zYXR0cihhdHRyaWJ1dGVzKQotCi0gICAgZGVmIHBhY2tfc2F0dHIoc2VsZiwgc2EpOgotICAgICAgICBtb2RlLCB1aWQsIGdpZCwgc2l6ZSwgYXRpbWUsIG10aW1lID0gc2EKLSAgICAgICAgc2VsZi5wYWNrX3VpbnQobW9kZSkKLSAgICAgICAgc2VsZi5wYWNrX3VpbnQodWlkKQotICAgICAgICBzZWxmLnBhY2tfdWludChnaWQpCi0gICAgICAgIHNlbGYucGFja191aW50KHNpemUpCi0gICAgICAgIHNlbGYucGFja190aW1ldmFsKGF0aW1lKQotICAgICAgICBzZWxmLnBhY2tfdGltZXZhbChtdGltZSkKLQotICAgIGRlZiBwYWNrX2Rpcm9wYXJncyhzZWxmLCBkYSk6Ci0gICAgICAgIGRpciwgbmFtZSA9IGRhCi0gICAgICAgIHNlbGYucGFja19maGFuZGxlKGRpcikKLSAgICAgICAgc2VsZi5wYWNrX3N0cmluZyhuYW1lKQotCi0gICAgZGVmIHBhY2tfcmVhZGRpcmFyZ3Moc2VsZiwgcmEpOgotICAgICAgICBkaXIsIGNvb2tpZSwgY291bnQgPSByYQotICAgICAgICBzZWxmLnBhY2tfZmhhbmRsZShkaXIpCi0gICAgICAgIHNlbGYucGFja191aW50KGNvb2tpZSkKLSAgICAgICAgc2VsZi5wYWNrX3VpbnQoY291bnQpCi0KLSAgICBkZWYgcGFja190aW1ldmFsKHNlbGYsIHR2KToKLSAgICAgICAgc2VjcywgdXNlY3MgPSB0dgotICAgICAgICBzZWxmLnBhY2tfdWludChzZWNzKQotICAgICAgICBzZWxmLnBhY2tfdWludCh1c2VjcykKLQotCi1jbGFzcyBORlNVbnBhY2tlcihNb3VudFVucGFja2VyKToKLQotICAgIGRlZiB1bnBhY2tfcmVhZGRpcnJlcyhzZWxmKToKLSAgICAgICAgc3RhdHVzID0gc2VsZi51bnBhY2tfZW51bSgpCi0gICAgICAgIGlmIHN0YXR1cyA9PSBORlNfT0s6Ci0gICAgICAgICAgICBlbnRyaWVzID0gc2VsZi51bnBhY2tfbGlzdChzZWxmLnVucGFja19lbnRyeSkKLSAgICAgICAgICAgIGVvZiA9IHNlbGYudW5wYWNrX2Jvb2woKQotICAgICAgICAgICAgcmVzdCA9IChlbnRyaWVzLCBlb2YpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXN0ID0gTm9uZQotICAgICAgICByZXR1cm4gKHN0YXR1cywgcmVzdCkKLQotICAgIGRlZiB1bnBhY2tfZW50cnkoc2VsZik6Ci0gICAgICAgIGZpbGVpZCA9IHNlbGYudW5wYWNrX3VpbnQoKQotICAgICAgICBuYW1lID0gc2VsZi51bnBhY2tfc3RyaW5nKCkKLSAgICAgICAgY29va2llID0gc2VsZi51bnBhY2tfdWludCgpCi0gICAgICAgIHJldHVybiAoZmlsZWlkLCBuYW1lLCBjb29raWUpCi0KLSAgICBkZWYgdW5wYWNrX2Rpcm9wcmVzKHNlbGYpOgotICAgICAgICBzdGF0dXMgPSBzZWxmLnVucGFja19lbnVtKCkKLSAgICAgICAgaWYgc3RhdHVzID09IE5GU19PSzoKLSAgICAgICAgICAgIGZoID0gc2VsZi51bnBhY2tfZmhhbmRsZSgpCi0gICAgICAgICAgICBmYSA9IHNlbGYudW5wYWNrX2ZhdHRyKCkKLSAgICAgICAgICAgIHJlc3QgPSAoZmgsIGZhKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmVzdCA9IE5vbmUKLSAgICAgICAgcmV0dXJuIChzdGF0dXMsIHJlc3QpCi0KLSAgICBkZWYgdW5wYWNrX2F0dHJzdGF0KHNlbGYpOgotICAgICAgICBzdGF0dXMgPSBzZWxmLnVucGFja19lbnVtKCkKLSAgICAgICAgaWYgc3RhdHVzID09IE5GU19PSzoKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBzZWxmLnVucGFja19mYXR0cigpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBhdHRyaWJ1dGVzID0gTm9uZQotICAgICAgICByZXR1cm4gc3RhdHVzLCBhdHRyaWJ1dGVzCi0KLSAgICBkZWYgdW5wYWNrX2ZhdHRyKHNlbGYpOgotICAgICAgICB0eXBlID0gc2VsZi51bnBhY2tfZW51bSgpCi0gICAgICAgIG1vZGUgPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgbmxpbmsgPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgdWlkID0gc2VsZi51bnBhY2tfdWludCgpCi0gICAgICAgIGdpZCA9IHNlbGYudW5wYWNrX3VpbnQoKQotICAgICAgICBzaXplID0gc2VsZi51bnBhY2tfdWludCgpCi0gICAgICAgIGJsb2Nrc2l6ZSA9IHNlbGYudW5wYWNrX3VpbnQoKQotICAgICAgICByZGV2ID0gc2VsZi51bnBhY2tfdWludCgpCi0gICAgICAgIGJsb2NrcyA9IHNlbGYudW5wYWNrX3VpbnQoKQotICAgICAgICBmc2lkID0gc2VsZi51bnBhY2tfdWludCgpCi0gICAgICAgIGZpbGVpZCA9IHNlbGYudW5wYWNrX3VpbnQoKQotICAgICAgICBhdGltZSA9IHNlbGYudW5wYWNrX3RpbWV2YWwoKQotICAgICAgICBtdGltZSA9IHNlbGYudW5wYWNrX3RpbWV2YWwoKQotICAgICAgICBjdGltZSA9IHNlbGYudW5wYWNrX3RpbWV2YWwoKQotICAgICAgICByZXR1cm4gKHR5cGUsIG1vZGUsIG5saW5rLCB1aWQsIGdpZCwgc2l6ZSwgYmxvY2tzaXplLCBcCi0gICAgICAgICAgICAgICAgcmRldiwgYmxvY2tzLCBmc2lkLCBmaWxlaWQsIGF0aW1lLCBtdGltZSwgY3RpbWUpCi0KLSAgICBkZWYgdW5wYWNrX3RpbWV2YWwoc2VsZik6Ci0gICAgICAgIHNlY3MgPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgdXNlY3MgPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgcmV0dXJuIChzZWNzLCB1c2VjcykKLQotCi1jbGFzcyBORlNDbGllbnQoVURQQ2xpZW50KToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0KToKLSAgICAgICAgVURQQ2xpZW50Ll9faW5pdF9fKHNlbGYsIGhvc3QsIE5GU19QUk9HUkFNLCBORlNfVkVSU0lPTikKLQotICAgIGRlZiBhZGRwYWNrZXJzKHNlbGYpOgotICAgICAgICBzZWxmLnBhY2tlciA9IE5GU1BhY2tlcigpCi0gICAgICAgIHNlbGYudW5wYWNrZXIgPSBORlNVbnBhY2tlcignJykKLQotICAgIGRlZiBta2NyZWQoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuY3JlZCBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi5jcmVkID0gcnBjLkFVVEhfVU5JWCwgcnBjLm1ha2VfYXV0aF91bml4X2RlZmF1bHQoKQotICAgICAgICByZXR1cm4gc2VsZi5jcmVkCi0KLSAgICBkZWYgR2V0YXR0cihzZWxmLCBmaCk6Ci0gICAgICAgIHJldHVybiBzZWxmLm1ha2VfY2FsbCgxLCBmaCwgXAotICAgICAgICAgICAgICAgIHNlbGYucGFja2VyLnBhY2tfZmhhbmRsZSwgXAotICAgICAgICAgICAgICAgIHNlbGYudW5wYWNrZXIudW5wYWNrX2F0dHJzdGF0KQotCi0gICAgZGVmIFNldGF0dHIoc2VsZiwgc2EpOgotICAgICAgICByZXR1cm4gc2VsZi5tYWtlX2NhbGwoMiwgc2EsIFwKLSAgICAgICAgICAgICAgICBzZWxmLnBhY2tlci5wYWNrX3NhdHRyYXJncywgXAotICAgICAgICAgICAgICAgIHNlbGYudW5wYWNrZXIudW5wYWNrX2F0dHJzdGF0KQotCi0gICAgIyBSb290KCkgaXMgb2Jzb2xldGUKLQotICAgIGRlZiBMb29rdXAoc2VsZiwgZGEpOgotICAgICAgICByZXR1cm4gc2VsZi5tYWtlX2NhbGwoNCwgZGEsIFwKLSAgICAgICAgICAgICAgICBzZWxmLnBhY2tlci5wYWNrX2Rpcm9wYXJncywgXAotICAgICAgICAgICAgICAgIHNlbGYudW5wYWNrZXIudW5wYWNrX2Rpcm9wcmVzKQotCi0gICAgIyAuLi4KLQotICAgIGRlZiBSZWFkZGlyKHNlbGYsIHJhKToKLSAgICAgICAgcmV0dXJuIHNlbGYubWFrZV9jYWxsKDE2LCByYSwgXAotICAgICAgICAgICAgICAgIHNlbGYucGFja2VyLnBhY2tfcmVhZGRpcmFyZ3MsIFwKLSAgICAgICAgICAgICAgICBzZWxmLnVucGFja2VyLnVucGFja19yZWFkZGlycmVzKQotCi0gICAgIyBTaG9ydGhhbmQgdG8gZ2V0IHRoZSBlbnRpcmUgY29udGVudHMgb2YgYSBkaXJlY3RvcnkKLSAgICBkZWYgTGlzdGRpcihzZWxmLCBkaXIpOgotICAgICAgICBsaXN0ID0gW10KLSAgICAgICAgcmEgPSAoZGlyLCAwLCAyMDAwKQotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgKHN0YXR1cywgcmVzdCkgPSBzZWxmLlJlYWRkaXIocmEpCi0gICAgICAgICAgICBpZiBzdGF0dXMgIT0gTkZTX09LOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBlbnRyaWVzLCBlb2YgPSByZXN0Ci0gICAgICAgICAgICBsYXN0X2Nvb2tpZSA9IE5vbmUKLSAgICAgICAgICAgIGZvciBmaWxlaWQsIG5hbWUsIGNvb2tpZSBpbiBlbnRyaWVzOgotICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKChmaWxlaWQsIG5hbWUpKQotICAgICAgICAgICAgICAgIGxhc3RfY29va2llID0gY29va2llCi0gICAgICAgICAgICBpZiBlb2Ygb3IgbGFzdF9jb29raWUgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgcmEgPSAocmFbMF0sIGxhc3RfY29va2llLCByYVsyXSkKLSAgICAgICAgcmV0dXJuIGxpc3QKLQotCi1kZWYgdGVzdCgpOgotICAgIGltcG9ydCBzeXMKLSAgICBpZiBzeXMuYXJndlsxOl06IGhvc3QgPSBzeXMuYXJndlsxXQotICAgIGVsc2U6IGhvc3QgPSAnJwotICAgIGlmIHN5cy5hcmd2WzI6XTogZmlsZXN5cyA9IHN5cy5hcmd2WzJdCi0gICAgZWxzZTogZmlsZXN5cyA9IE5vbmUKLSAgICBmcm9tIG1vdW50Y2xpZW50IGltcG9ydCBVRFBNb3VudENsaWVudCwgVENQTW91bnRDbGllbnQKLSAgICBtY2wgPSBUQ1BNb3VudENsaWVudChob3N0KQotICAgIGlmIGZpbGVzeXMgaXMgTm9uZToKLSAgICAgICAgbGlzdCA9IG1jbC5FeHBvcnQoKQotICAgICAgICBmb3IgaXRlbSBpbiBsaXN0OgotICAgICAgICAgICAgcHJpbnQoaXRlbSkKLSAgICAgICAgcmV0dXJuCi0gICAgc2YgPSBtY2wuTW50KGZpbGVzeXMpCi0gICAgcHJpbnQoc2YpCi0gICAgZmggPSBzZlsxXQotICAgIGlmIGZoOgotICAgICAgICBuY2wgPSBORlNDbGllbnQoaG9zdCkKLSAgICAgICAgYXR0cnN0YXQgPSBuY2wuR2V0YXR0cihmaCkKLSAgICAgICAgcHJpbnQoYXR0cnN0YXQpCi0gICAgICAgIGxpc3QgPSBuY2wuTGlzdGRpcihmaCkKLSAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdDogcHJpbnQoaXRlbSkKLSAgICAgICAgbWNsLlVtbnQoZmlsZXN5cykKZGlmZiAtLWdpdCBhL0RlbW8vcnBjL3JudXNlcnNjbGllbnQucHkgYi9EZW1vL3JwYy9ybnVzZXJzY2xpZW50LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWFiZWZlLi4wMDAwMDAwCi0tLSBhL0RlbW8vcnBjL3JudXNlcnNjbGllbnQucHkKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0jIFJlbW90ZSBudXNlcnMgY2xpZW50IGludGVyZmFjZQotCi1pbXBvcnQgcnBjCi1mcm9tIHJwYyBpbXBvcnQgUGFja2VyLCBVbnBhY2tlciwgVURQQ2xpZW50LCBCcm9hZGNhc3RVRFBDbGllbnQKLQotCi1jbGFzcyBSbnVzZXJzUGFja2VyKFBhY2tlcik6Ci0gICAgZGVmIHBhY2tfdXRtcChzZWxmLCB1aSk6Ci0gICAgICAgIHV0X2xpbmUsIHV0X25hbWUsIHV0X2hvc3QsIHV0X3RpbWUgPSB1dG1wCi0gICAgICAgIHNlbGYucGFja19zdHJpbmcodXRfbGluZSkKLSAgICAgICAgc2VsZi5wYWNrX3N0cmluZyh1dF9uYW1lKQotICAgICAgICBzZWxmLnBhY2tfc3RyaW5nKHV0X2hvc3QpCi0gICAgICAgIHNlbGYucGFja19pbnQodXRfdGltZSkKLSAgICBkZWYgcGFja191dG1waWRsZShzZWxmLCB1aSk6Ci0gICAgICAgIHVpX2l0bXAsIHVpX2lkbGUgPSB1aQotICAgICAgICBzZWxmLnBhY2tfdXRtcCh1aV91dG1wKQotICAgICAgICBzZWxmLnBhY2tfdWludCh1aV9pZGxlKQotICAgIGRlZiBwYWNrX3V0bXBpZGxlYXJyKHNlbGYsIGxpc3QpOgotICAgICAgICBzZWxmLnBhY2tfYXJyYXkobGlzdCwgc2VsZi5wYWNrX2l0bXBpZGxlKQotCi0KLWNsYXNzIFJudXNlcnNVbnBhY2tlcihVbnBhY2tlcik6Ci0gICAgZGVmIHVucGFja191dG1wKHNlbGYpOgotICAgICAgICB1dF9saW5lID0gc2VsZi51bnBhY2tfc3RyaW5nKCkKLSAgICAgICAgdXRfbmFtZSA9IHNlbGYudW5wYWNrX3N0cmluZygpCi0gICAgICAgIHV0X2hvc3QgPSBzZWxmLnVucGFja19zdHJpbmcoKQotICAgICAgICB1dF90aW1lID0gc2VsZi51bnBhY2tfaW50KCkKLSAgICAgICAgcmV0dXJuIHV0X2xpbmUsIHV0X25hbWUsIHV0X2hvc3QsIHV0X3RpbWUKLSAgICBkZWYgdW5wYWNrX3V0bXBpZGxlKHNlbGYpOgotICAgICAgICB1aV91dG1wID0gc2VsZi51bnBhY2tfdXRtcCgpCi0gICAgICAgIHVpX2lkbGUgPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgcmV0dXJuIHVpX3V0bXAsIHVpX2lkbGUKLSAgICBkZWYgdW5wYWNrX3V0bXBpZGxlYXJyKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi51bnBhY2tfYXJyYXkoc2VsZi51bnBhY2tfdXRtcGlkbGUpCi0KLQotY2xhc3MgUGFydGlhbFJudXNlcnNDbGllbnQ6Ci0KLSAgICBkZWYgYWRkcGFja2VycyhzZWxmKToKLSAgICAgICAgc2VsZi5wYWNrZXIgPSBSbnVzZXJzUGFja2VyKCkKLSAgICAgICAgc2VsZi51bnBhY2tlciA9IFJudXNlcnNVbnBhY2tlcignJykKLQotICAgIGRlZiBOdW0oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLm1ha2VfY2FsbCgxLCBOb25lLCBOb25lLCBzZWxmLnVucGFja2VyLnVucGFja19pbnQpCi0KLSAgICBkZWYgTmFtZXMoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLm1ha2VfY2FsbCgyLCBOb25lLCBcCi0gICAgICAgICAgICAgICAgTm9uZSwgc2VsZi51bnBhY2tlci51bnBhY2tfdXRtcGlkbGVhcnIpCi0KLSAgICBkZWYgQWxsbmFtZXMoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLm1ha2VfY2FsbCgzLCBOb25lLCBcCi0gICAgICAgICAgICAgICAgTm9uZSwgc2VsZi51bnBhY2tlci51bnBhY2tfdXRtcGlkbGVhcnIpCi0KLQotY2xhc3MgUm51c2Vyc0NsaWVudChQYXJ0aWFsUm51c2Vyc0NsaWVudCwgVURQQ2xpZW50KToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0KToKLSAgICAgICAgVURQQ2xpZW50Ll9faW5pdF9fKHNlbGYsIGhvc3QsIDEwMDAwMiwgMikKLQotCi1jbGFzcyBCcm9hZGNhc3RSbnVzZXJzQ2xpZW50KFBhcnRpYWxSbnVzZXJzQ2xpZW50LCBCcm9hZGNhc3RVRFBDbGllbnQpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGJjYXN0YWRkcik6Ci0gICAgICAgIEJyb2FkY2FzdFVEUENsaWVudC5fX2luaXRfXyhzZWxmLCBiY2FzdGFkZHIsIDEwMDAwMiwgMikKLQotCi1kZWYgdGVzdCgpOgotICAgIGltcG9ydCBzeXMKLSAgICBpZiBub3Qgc3lzLmFyZ3ZbMTpdOgotICAgICAgICB0ZXN0YmNhc3QoKQotICAgICAgICByZXR1cm4KLSAgICBlbHNlOgotICAgICAgICBob3N0ID0gc3lzLmFyZ3ZbMV0KLSAgICBjID0gUm51c2Vyc0NsaWVudChob3N0KQotICAgIGxpc3QgPSBjLk5hbWVzKCkKLSAgICBmb3IgKGxpbmUsIG5hbWUsIGhvc3QsIHRpbWUpLCBpZGxlIGluIGxpc3Q6Ci0gICAgICAgIGxpbmUgPSBzdHJpcDAobGluZSkKLSAgICAgICAgbmFtZSA9IHN0cmlwMChuYW1lKQotICAgICAgICBob3N0ID0gc3RyaXAwKGhvc3QpCi0gICAgICAgIHByaW50KCIlciAlciAlciAlcyAlcyIgJSAobmFtZSwgaG9zdCwgbGluZSwgdGltZSwgaWRsZSkpCi0KLWRlZiB0ZXN0YmNhc3QoKToKLSAgICBjID0gQnJvYWRjYXN0Um51c2Vyc0NsaWVudCgnPGJyb2FkY2FzdD4nKQotICAgIGRlZiBsaXN0aXQobGlzdCwgZnJvbWFkZHIpOgotICAgICAgICBob3N0LCBwb3J0ID0gZnJvbWFkZHIKLSAgICAgICAgcHJpbnQoaG9zdCArICdcdDonLCBlbmQ9JyAnKQotICAgICAgICBmb3IgKGxpbmUsIG5hbWUsIGhvc3QsIHRpbWUpLCBpZGxlIGluIGxpc3Q6Ci0gICAgICAgICAgICBwcmludChzdHJpcDAobmFtZSksIGVuZD0nICcpCi0gICAgICAgIHByaW50KCkKLSAgICBjLnNldF9yZXBseV9oYW5kbGVyKGxpc3RpdCkKLSAgICBhbGwgPSBjLk5hbWVzKCkKLSAgICBwcmludCgnVG90YWwgQ291bnQ6JywgbGVuKGFsbCkpCi0KLWRlZiBzdHJpcDAocyk6Ci0gICAgd2hpbGUgcyBhbmQgc1stMV0gPT0gJ1wwJzogcyA9IHNbOi0xXQotICAgIHJldHVybiBzCi0KLXRlc3QoKQpkaWZmIC0tZ2l0IGEvRGVtby9ycGMvcnBjLnB5IGIvRGVtby9ycGMvcnBjLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGIzMDE3Li4wMDAwMDAwCi0tLSBhL0RlbW8vcnBjL3JwYy5weQorKysgL2Rldi9udWxsCkBAIC0xLDg5MCArMCwwIEBACi0jIFN1biBSUEMgdmVyc2lvbiAyIC0tIFJGQzEwNTcuCi0KLSMgWFhYIFRoZXJlIHNob3VsZCBiZSBzZXBhcmF0ZSBleGNlcHRpb25zIGZvciB0aGUgdmFyaW91cyByZWFzb25zIHdoeQotIyBYWFggYW4gUlBDIGNhbiBmYWlsLCByYXRoZXIgdGhhbiB1c2luZyBSdW50aW1lRXJyb3IgZm9yIGV2ZXJ5dGhpbmcKLQotIyBYWFggTmVlZCB0byB1c2UgY2xhc3MgYmFzZWQgZXhjZXB0aW9ucyByYXRoZXIgdGhhbiBzdHJpbmcgZXhjZXB0aW9ucwotCi0jIFhYWCBUaGUgVURQIHZlcnNpb24gb2YgdGhlIHByb3RvY29sIHJlc2VuZHMgcmVxdWVzdHMgd2hlbiBpdCBkb2VzCi0jIFhYWCBub3QgcmVjZWl2ZSBhIHRpbWVseSByZXBseSAtLSB1c2Ugb25seSBmb3IgaWRlbXBvdGVudCBjYWxscyEKLQotIyBYWFggVGhlcmUgaXMgbm8gcHJvdmlzaW9uIGZvciBjYWxsIHRpbWVvdXQgb24gVENQIGNvbm5lY3Rpb25zCi0KLWltcG9ydCB4ZHIKLWltcG9ydCBzb2NrZXQKLWltcG9ydCBvcwotCi1SUENWRVJTSU9OID0gMgotCi1DQUxMID0gMAotUkVQTFkgPSAxCi0KLUFVVEhfTlVMTCA9IDAKLUFVVEhfVU5JWCA9IDEKLUFVVEhfU0hPUlQgPSAyCi1BVVRIX0RFUyA9IDMKLQotTVNHX0FDQ0VQVEVEID0gMAotTVNHX0RFTklFRCA9IDEKLQotU1VDQ0VTUyA9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUlBDIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseQotUFJPR19VTkFWQUlMICA9IDEgICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3RlIGhhc24ndCBleHBvcnRlZCBwcm9ncmFtCi1QUk9HX01JU01BVENIID0gMiAgICAgICAgICAgICAgICAgICAgICAgIyByZW1vdGUgY2FuJ3Qgc3VwcG9ydCB2ZXJzaW9uICMKLVBST0NfVU5BVkFJTCAgPSAzICAgICAgICAgICAgICAgICAgICAgICAjIHByb2dyYW0gY2FuJ3Qgc3VwcG9ydCBwcm9jZWR1cmUKLUdBUkJBR0VfQVJHUyAgPSA0ICAgICAgICAgICAgICAgICAgICAgICAjIHByb2NlZHVyZSBjYW4ndCBkZWNvZGUgcGFyYW1zCi0KLVJQQ19NSVNNQVRDSCA9IDAgICAgICAgICAgICAgICAgICAgICAgICAjIFJQQyB2ZXJzaW9uIG51bWJlciAhPSAyCi1BVVRIX0VSUk9SID0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZW1vdGUgY2FuJ3QgYXV0aGVudGljYXRlIGNhbGxlcgotCi1BVVRIX0JBRENSRUQgICAgICA9IDEgICAgICAgICAgICAgICAgICAgIyBiYWQgY3JlZGVudGlhbHMgKHNlYWwgYnJva2VuKQotQVVUSF9SRUpFQ1RFRENSRUQgPSAyICAgICAgICAgICAgICAgICAgICMgY2xpZW50IG11c3QgYmVnaW4gbmV3IHNlc3Npb24KLUFVVEhfQkFEVkVSRiAgICAgID0gMyAgICAgICAgICAgICAgICAgICAjIGJhZCB2ZXJpZmllciAoc2VhbCBicm9rZW4pCi1BVVRIX1JFSkVDVEVEVkVSRiA9IDQgICAgICAgICAgICAgICAgICAgIyB2ZXJpZmllciBleHBpcmVkIG9yIHJlcGxheWVkCi1BVVRIX1RPT1dFQUsgICAgICA9IDUgICAgICAgICAgICAgICAgICAgIyByZWplY3RlZCBmb3Igc2VjdXJpdHkgcmVhc29ucwotCi0KLWNsYXNzIFBhY2tlcih4ZHIuUGFja2VyKToKLQotICAgIGRlZiBwYWNrX2F1dGgoc2VsZiwgYXV0aCk6Ci0gICAgICAgIGZsYXZvciwgc3R1ZmYgPSBhdXRoCi0gICAgICAgIHNlbGYucGFja19lbnVtKGZsYXZvcikKLSAgICAgICAgc2VsZi5wYWNrX29wYXF1ZShzdHVmZikKLQotICAgIGRlZiBwYWNrX2F1dGhfdW5peChzZWxmLCBzdGFtcCwgbWFjaGluZW5hbWUsIHVpZCwgZ2lkLCBnaWRzKToKLSAgICAgICAgc2VsZi5wYWNrX3VpbnQoc3RhbXApCi0gICAgICAgIHNlbGYucGFja19zdHJpbmcobWFjaGluZW5hbWUpCi0gICAgICAgIHNlbGYucGFja191aW50KHVpZCkKLSAgICAgICAgc2VsZi5wYWNrX3VpbnQoZ2lkKQotICAgICAgICBzZWxmLnBhY2tfdWludChsZW4oZ2lkcykpCi0gICAgICAgIGZvciBpIGluIGdpZHM6Ci0gICAgICAgICAgICBzZWxmLnBhY2tfdWludChpKQotCi0gICAgZGVmIHBhY2tfY2FsbGhlYWRlcihzZWxmLCB4aWQsIHByb2csIHZlcnMsIHByb2MsIGNyZWQsIHZlcmYpOgotICAgICAgICBzZWxmLnBhY2tfdWludCh4aWQpCi0gICAgICAgIHNlbGYucGFja19lbnVtKENBTEwpCi0gICAgICAgIHNlbGYucGFja191aW50KFJQQ1ZFUlNJT04pCi0gICAgICAgIHNlbGYucGFja191aW50KHByb2cpCi0gICAgICAgIHNlbGYucGFja191aW50KHZlcnMpCi0gICAgICAgIHNlbGYucGFja191aW50KHByb2MpCi0gICAgICAgIHNlbGYucGFja19hdXRoKGNyZWQpCi0gICAgICAgIHNlbGYucGFja19hdXRoKHZlcmYpCi0gICAgICAgICMgQ2FsbGVyIG11c3QgYWRkIHByb2NlZHVyZS1zcGVjaWZpYyBwYXJ0IG9mIGNhbGwKLQotICAgIGRlZiBwYWNrX3JlcGx5aGVhZGVyKHNlbGYsIHhpZCwgdmVyZik6Ci0gICAgICAgIHNlbGYucGFja191aW50KHhpZCkKLSAgICAgICAgc2VsZi5wYWNrX2VudW0oUkVQTFkpCi0gICAgICAgIHNlbGYucGFja191aW50KE1TR19BQ0NFUFRFRCkKLSAgICAgICAgc2VsZi5wYWNrX2F1dGgodmVyZikKLSAgICAgICAgc2VsZi5wYWNrX2VudW0oU1VDQ0VTUykKLSAgICAgICAgIyBDYWxsZXIgbXVzdCBhZGQgcHJvY2VkdXJlLXNwZWNpZmljIHBhcnQgb2YgcmVwbHkKLQotCi0jIEV4Y2VwdGlvbnMKLWNsYXNzIEJhZFJQQ0Zvcm1hdChFeGNlcHRpb24pOiBwYXNzCi1jbGFzcyBCYWRSUENWZXJzaW9uKEV4Y2VwdGlvbik6IHBhc3MKLWNsYXNzIEdhcmJhZ2VBcmdzKEV4Y2VwdGlvbik6IHBhc3MKLQotY2xhc3MgVW5wYWNrZXIoeGRyLlVucGFja2VyKToKLQotICAgIGRlZiB1bnBhY2tfYXV0aChzZWxmKToKLSAgICAgICAgZmxhdm9yID0gc2VsZi51bnBhY2tfZW51bSgpCi0gICAgICAgIHN0dWZmID0gc2VsZi51bnBhY2tfb3BhcXVlKCkKLSAgICAgICAgcmV0dXJuIChmbGF2b3IsIHN0dWZmKQotCi0gICAgZGVmIHVucGFja19jYWxsaGVhZGVyKHNlbGYpOgotICAgICAgICB4aWQgPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgdGVtcCA9IHNlbGYudW5wYWNrX2VudW0oKQotICAgICAgICBpZiB0ZW1wICE9IENBTEw6Ci0gICAgICAgICAgICByYWlzZSBCYWRSUENGb3JtYXQoJ25vIENBTEwgYnV0ICVyJyAlICh0ZW1wLCkpCi0gICAgICAgIHRlbXAgPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgaWYgdGVtcCAhPSBSUENWRVJTSU9OOgotICAgICAgICAgICAgcmFpc2UgQmFkUlBDVmVyc2lvbignYmFkIFJQQyB2ZXJzaW9uICVyJyAlICh0ZW1wLCkpCi0gICAgICAgIHByb2cgPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgdmVycyA9IHNlbGYudW5wYWNrX3VpbnQoKQotICAgICAgICBwcm9jID0gc2VsZi51bnBhY2tfdWludCgpCi0gICAgICAgIGNyZWQgPSBzZWxmLnVucGFja19hdXRoKCkKLSAgICAgICAgdmVyZiA9IHNlbGYudW5wYWNrX2F1dGgoKQotICAgICAgICByZXR1cm4geGlkLCBwcm9nLCB2ZXJzLCBwcm9jLCBjcmVkLCB2ZXJmCi0gICAgICAgICMgQ2FsbGVyIG11c3QgYWRkIHByb2NlZHVyZS1zcGVjaWZpYyBwYXJ0IG9mIGNhbGwKLQotICAgIGRlZiB1bnBhY2tfcmVwbHloZWFkZXIoc2VsZik6Ci0gICAgICAgIHhpZCA9IHNlbGYudW5wYWNrX3VpbnQoKQotICAgICAgICBtdHlwZSA9IHNlbGYudW5wYWNrX2VudW0oKQotICAgICAgICBpZiBtdHlwZSAhPSBSRVBMWToKLSAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignbm8gUkVQTFkgYnV0ICVyJyAlIChtdHlwZSwpKQotICAgICAgICBzdGF0ID0gc2VsZi51bnBhY2tfZW51bSgpCi0gICAgICAgIGlmIHN0YXQgPT0gTVNHX0RFTklFRDoKLSAgICAgICAgICAgIHN0YXQgPSBzZWxmLnVucGFja19lbnVtKCkKLSAgICAgICAgICAgIGlmIHN0YXQgPT0gUlBDX01JU01BVENIOgotICAgICAgICAgICAgICAgIGxvdyA9IHNlbGYudW5wYWNrX3VpbnQoKQotICAgICAgICAgICAgICAgIGhpZ2ggPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ01TR19ERU5JRUQ6IFJQQ19NSVNNQVRDSDogJXInICUgKChsb3csIGhpZ2gpLCkpCi0gICAgICAgICAgICBpZiBzdGF0ID09IEFVVEhfRVJST1I6Ci0gICAgICAgICAgICAgICAgc3RhdCA9IHNlbGYudW5wYWNrX3VpbnQoKQotICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignTVNHX0RFTklFRDogQVVUSF9FUlJPUjogJXInICUgKHN0YXQsKSkKLSAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignTVNHX0RFTklFRDogJXInICUgKHN0YXQsKSkKLSAgICAgICAgaWYgc3RhdCAhPSBNU0dfQUNDRVBURUQ6Ci0gICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ05laXRoZXIgTVNHX0RFTklFRCBub3IgTVNHX0FDQ0VQVEVEOiAlcicgJSAoc3RhdCwpKQotICAgICAgICB2ZXJmID0gc2VsZi51bnBhY2tfYXV0aCgpCi0gICAgICAgIHN0YXQgPSBzZWxmLnVucGFja19lbnVtKCkKLSAgICAgICAgaWYgc3RhdCA9PSBQUk9HX1VOQVZBSUw6Ci0gICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ2NhbGwgZmFpbGVkOiBQUk9HX1VOQVZBSUwnKQotICAgICAgICBpZiBzdGF0ID09IFBST0dfTUlTTUFUQ0g6Ci0gICAgICAgICAgICBsb3cgPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgICAgIGhpZ2ggPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignY2FsbCBmYWlsZWQ6IFBST0dfTUlTTUFUQ0g6ICVyJyAlICgobG93LCBoaWdoKSwpKQotICAgICAgICBpZiBzdGF0ID09IFBST0NfVU5BVkFJTDoKLSAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignY2FsbCBmYWlsZWQ6IFBST0NfVU5BVkFJTCcpCi0gICAgICAgIGlmIHN0YXQgPT0gR0FSQkFHRV9BUkdTOgotICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdjYWxsIGZhaWxlZDogR0FSQkFHRV9BUkdTJykKLSAgICAgICAgaWYgc3RhdCAhPSBTVUNDRVNTOgotICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdjYWxsIGZhaWxlZDogJXInICUgKHN0YXQsKSkKLSAgICAgICAgcmV0dXJuIHhpZCwgdmVyZgotICAgICAgICAjIENhbGxlciBtdXN0IGdldCBwcm9jZWR1cmUtc3BlY2lmaWMgcGFydCBvZiByZXBseQotCi0KLSMgU3Vicm91dGluZXMgdG8gY3JlYXRlIG9wYXF1ZSBhdXRoZW50aWNhdGlvbiBvYmplY3RzCi0KLWRlZiBtYWtlX2F1dGhfbnVsbCgpOgotICAgIHJldHVybiAnJwotCi1kZWYgbWFrZV9hdXRoX3VuaXgoc2VlZCwgaG9zdCwgdWlkLCBnaWQsIGdyb3Vwcyk6Ci0gICAgcCA9IFBhY2tlcigpCi0gICAgcC5wYWNrX2F1dGhfdW5peChzZWVkLCBob3N0LCB1aWQsIGdpZCwgZ3JvdXBzKQotICAgIHJldHVybiBwLmdldF9idWYoKQotCi1kZWYgbWFrZV9hdXRoX3VuaXhfZGVmYXVsdCgpOgotICAgIHRyeToKLSAgICAgICAgZnJvbSBvcyBpbXBvcnQgZ2V0dWlkLCBnZXRnaWQKLSAgICAgICAgdWlkID0gZ2V0dWlkKCkKLSAgICAgICAgZ2lkID0gZ2V0Z2lkKCkKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHVpZCA9IGdpZCA9IDAKLSAgICBpbXBvcnQgdGltZQotICAgIHJldHVybiBtYWtlX2F1dGhfdW5peChpbnQodGltZS50aW1lKCktdW5peF9lcG9jaCgpKSwgXAotICAgICAgICAgICAgICBzb2NrZXQuZ2V0aG9zdG5hbWUoKSwgdWlkLCBnaWQsIFtdKQotCi1fdW5peF9lcG9jaCA9IC0xCi1kZWYgdW5peF9lcG9jaCgpOgotICAgICIiIlZlcnkgcGFpbmZ1bCBjYWxjdWxhdGlvbiBvZiB3aGVuIHRoZSBVbml4IEVwb2NoIGlzLgotCi0gICAgVGhpcyBpcyBkZWZpbmVkIGFzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGltZS50aW1lKCkgb24gSmFuIDFzdCwKLSAgICAxOTcwLCAwMDowMDowMCBHTVQuCi0KLSAgICBPbiBhIFVuaXggc3lzdGVtLCB0aGlzIHNob3VsZCBhbHdheXMgcmV0dXJuIDAuMC4gIE9uIGEgTWFjLCB0aGUKLSAgICBjYWxjdWxhdGlvbnMgYXJlIG5lZWRlZCAtLSBhbmQgaGFyZCBiZWNhdXNlIG9mIGludGVnZXIgb3ZlcmZsb3cKLSAgICBhbmQgb3RoZXIgbGltaXRhdGlvbnMuCi0KLSAgICAiIiIKLSAgICBnbG9iYWwgX3VuaXhfZXBvY2gKLSAgICBpZiBfdW5peF9lcG9jaCA+PSAwOiByZXR1cm4gX3VuaXhfZXBvY2gKLSAgICBpbXBvcnQgdGltZQotICAgIG5vdyA9IHRpbWUudGltZSgpCi0gICAgbG9jYWx0ID0gdGltZS5sb2NhbHRpbWUobm93KSAgICAgICAgIyAoeSwgbSwgZCwgaGgsIG1tLCBzcywgLi4uLCAuLi4sIC4uLikKLSAgICBnbXQgPSB0aW1lLmdtdGltZShub3cpCi0gICAgb2Zmc2V0ID0gdGltZS5ta3RpbWUobG9jYWx0KSAtIHRpbWUubWt0aW1lKGdtdCkKLSAgICB5LCBtLCBkLCBoaCwgbW0sIHNzID0gMTk3MCwgMSwgMSwgMCwgMCwgMAotICAgIG9mZnNldCwgc3MgPSBkaXZtb2Qoc3MgKyBvZmZzZXQsIDYwKQotICAgIG9mZnNldCwgbW0gPSBkaXZtb2QobW0gKyBvZmZzZXQsIDYwKQotICAgIG9mZnNldCwgaGggPSBkaXZtb2QoaGggKyBvZmZzZXQsIDI0KQotICAgIGQgPSBkICsgb2Zmc2V0Ci0gICAgX3VuaXhfZXBvY2ggPSB0aW1lLm1rdGltZSgoeSwgbSwgZCwgaGgsIG1tLCBzcywgMCwgMCwgMCkpCi0gICAgcHJpbnQoIlVuaXggZXBvY2g6IiwgdGltZS5jdGltZShfdW5peF9lcG9jaCkpCi0gICAgcmV0dXJuIF91bml4X2Vwb2NoCi0KLQotIyBDb21tb24gYmFzZSBjbGFzcyBmb3IgY2xpZW50cwotCi1jbGFzcyBDbGllbnQ6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcHJvZywgdmVycywgcG9ydCk6Ci0gICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKLSAgICAgICAgc2VsZi5wcm9nID0gcHJvZwotICAgICAgICBzZWxmLnZlcnMgPSB2ZXJzCi0gICAgICAgIHNlbGYucG9ydCA9IHBvcnQKLSAgICAgICAgc2VsZi5tYWtlc29ja2V0KCkgIyBBc3NpZ25zIHRvIHNlbGYuc29jawotICAgICAgICBzZWxmLmJpbmRzb2NrZXQoKQotICAgICAgICBzZWxmLmNvbm5zb2NrZXQoKQotICAgICAgICBzZWxmLmxhc3R4aWQgPSAwICMgWFhYIHNob3VsZCBiZSBtb3JlIHJhbmRvbT8KLSAgICAgICAgc2VsZi5hZGRwYWNrZXJzKCkKLSAgICAgICAgc2VsZi5jcmVkID0gTm9uZQotICAgICAgICBzZWxmLnZlcmYgPSBOb25lCi0KLSAgICBkZWYgY2xvc2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuc29jay5jbG9zZSgpCi0KLSAgICBkZWYgbWFrZXNvY2tldChzZWxmKToKLSAgICAgICAgIyBUaGlzIE1VU1QgYmUgb3ZlcnJpZGRlbgotICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ21ha2Vzb2NrZXQgbm90IGRlZmluZWQnKQotCi0gICAgZGVmIGNvbm5zb2NrZXQoc2VsZik6Ci0gICAgICAgICMgT3ZlcnJpZGUgdGhpcyBpZiB5b3UgZG9uJ3Qgd2FudC9uZWVkIGEgY29ubmVjdGlvbgotICAgICAgICBzZWxmLnNvY2suY29ubmVjdCgoc2VsZi5ob3N0LCBzZWxmLnBvcnQpKQotCi0gICAgZGVmIGJpbmRzb2NrZXQoc2VsZik6Ci0gICAgICAgICMgT3ZlcnJpZGUgdGhpcyB0byBiaW5kIHRvIGEgZGlmZmVyZW50IHBvcnQgKGUuZy4gcmVzZXJ2ZWQpCi0gICAgICAgIHNlbGYuc29jay5iaW5kKCgnJywgMCkpCi0KLSAgICBkZWYgYWRkcGFja2VycyhzZWxmKToKLSAgICAgICAgIyBPdmVycmlkZSB0aGlzIHRvIHVzZSBkZXJpdmVkIGNsYXNzZXMgZnJvbSBQYWNrZXIvVW5wYWNrZXIKLSAgICAgICAgc2VsZi5wYWNrZXIgPSBQYWNrZXIoKQotICAgICAgICBzZWxmLnVucGFja2VyID0gVW5wYWNrZXIoJycpCi0KLSAgICBkZWYgbWFrZV9jYWxsKHNlbGYsIHByb2MsIGFyZ3MsIHBhY2tfZnVuYywgdW5wYWNrX2Z1bmMpOgotICAgICAgICAjIERvbid0IG5vcm1hbGx5IG92ZXJyaWRlIHRoaXMgKGJ1dCBzZWUgQnJvYWRjYXN0KQotICAgICAgICBpZiBwYWNrX2Z1bmMgaXMgTm9uZSBhbmQgYXJncyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbm9uLW51bGwgYXJncyB3aXRoIG51bGwgcGFja19mdW5jJykKLSAgICAgICAgc2VsZi5zdGFydF9jYWxsKHByb2MpCi0gICAgICAgIGlmIHBhY2tfZnVuYzoKLSAgICAgICAgICAgIHBhY2tfZnVuYyhhcmdzKQotICAgICAgICBzZWxmLmRvX2NhbGwoKQotICAgICAgICBpZiB1bnBhY2tfZnVuYzoKLSAgICAgICAgICAgIHJlc3VsdCA9IHVucGFja19mdW5jKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKLSAgICAgICAgc2VsZi51bnBhY2tlci5kb25lKCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdAotCi0gICAgZGVmIHN0YXJ0X2NhbGwoc2VsZiwgcHJvYyk6Ci0gICAgICAgICMgRG9uJ3Qgb3ZlcnJpZGUgdGhpcwotICAgICAgICBzZWxmLmxhc3R4aWQgPSB4aWQgPSBzZWxmLmxhc3R4aWQgKyAxCi0gICAgICAgIGNyZWQgPSBzZWxmLm1rY3JlZCgpCi0gICAgICAgIHZlcmYgPSBzZWxmLm1rdmVyZigpCi0gICAgICAgIHAgPSBzZWxmLnBhY2tlcgotICAgICAgICBwLnJlc2V0KCkKLSAgICAgICAgcC5wYWNrX2NhbGxoZWFkZXIoeGlkLCBzZWxmLnByb2csIHNlbGYudmVycywgcHJvYywgY3JlZCwgdmVyZikKLQotICAgIGRlZiBkb19jYWxsKHNlbGYpOgotICAgICAgICAjIFRoaXMgTVVTVCBiZSBvdmVycmlkZGVuCi0gICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignZG9fY2FsbCBub3QgZGVmaW5lZCcpCi0KLSAgICBkZWYgbWtjcmVkKHNlbGYpOgotICAgICAgICAjIE92ZXJyaWRlIHRoaXMgdG8gdXNlIG1vcmUgcG93ZXJmdWwgY3JlZGVudGlhbHMKLSAgICAgICAgaWYgc2VsZi5jcmVkIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLmNyZWQgPSAoQVVUSF9OVUxMLCBtYWtlX2F1dGhfbnVsbCgpKQotICAgICAgICByZXR1cm4gc2VsZi5jcmVkCi0KLSAgICBkZWYgbWt2ZXJmKHNlbGYpOgotICAgICAgICAjIE92ZXJyaWRlIHRoaXMgdG8gdXNlIGEgbW9yZSBwb3dlcmZ1bCB2ZXJpZmllcgotICAgICAgICBpZiBzZWxmLnZlcmYgaXMgTm9uZToKLSAgICAgICAgICAgIHNlbGYudmVyZiA9IChBVVRIX05VTEwsIG1ha2VfYXV0aF9udWxsKCkpCi0gICAgICAgIHJldHVybiBzZWxmLnZlcmYKLQotICAgIGRlZiBjYWxsXzAoc2VsZik6ICAgICAgICAgICAgICAgIyBQcm9jZWR1cmUgMCBpcyBhbHdheXMgbGlrZSB0aGlzCi0gICAgICAgIHJldHVybiBzZWxmLm1ha2VfY2FsbCgwLCBOb25lLCBOb25lLCBOb25lKQotCi0KLSMgUmVjb3JkLU1hcmtpbmcgc3RhbmRhcmQgc3VwcG9ydAotCi1kZWYgc2VuZGZyYWcoc29jaywgbGFzdCwgZnJhZyk6Ci0gICAgeCA9IGxlbihmcmFnKQotICAgIGlmIGxhc3Q6IHggPSB4IHwgMHg4MDAwMDAwMAotICAgIGhlYWRlciA9IChjaHIoaW50KHg+PjI0ICYgMHhmZikpICsgY2hyKGludCh4Pj4xNiAmIDB4ZmYpKSArIFwKLSAgICAgICAgICAgICAgY2hyKGludCh4Pj44ICYgMHhmZikpICsgY2hyKGludCh4ICYgMHhmZikpKQotICAgIHNvY2suc2VuZChoZWFkZXIgKyBmcmFnKQotCi1kZWYgc2VuZHJlY29yZChzb2NrLCByZWNvcmQpOgotICAgIHNlbmRmcmFnKHNvY2ssIDEsIHJlY29yZCkKLQotZGVmIHJlY3ZmcmFnKHNvY2spOgotICAgIGhlYWRlciA9IHNvY2sucmVjdig0KQotICAgIGlmIGxlbihoZWFkZXIpIDwgNDoKLSAgICAgICAgcmFpc2UgRU9GRXJyb3IKLSAgICB4ID0gaW50KG9yZChoZWFkZXJbMF0pKTw8MjQgfCBvcmQoaGVhZGVyWzFdKTw8MTYgfCBcCi0gICAgICAgIG9yZChoZWFkZXJbMl0pPDw4IHwgb3JkKGhlYWRlclszXSkKLSAgICBsYXN0ID0gKCh4ICYgMHg4MDAwMDAwMCkgIT0gMCkKLSAgICBuID0gaW50KHggJiAweDdmZmZmZmZmKQotICAgIGZyYWcgPSAnJwotICAgIHdoaWxlIG4gPiAwOgotICAgICAgICBidWYgPSBzb2NrLnJlY3YobikKLSAgICAgICAgaWYgbm90IGJ1ZjogcmFpc2UgRU9GRXJyb3IKLSAgICAgICAgbiA9IG4gLSBsZW4oYnVmKQotICAgICAgICBmcmFnID0gZnJhZyArIGJ1ZgotICAgIHJldHVybiBsYXN0LCBmcmFnCi0KLWRlZiByZWN2cmVjb3JkKHNvY2spOgotICAgIHJlY29yZCA9ICcnCi0gICAgbGFzdCA9IDAKLSAgICB3aGlsZSBub3QgbGFzdDoKLSAgICAgICAgbGFzdCwgZnJhZyA9IHJlY3ZmcmFnKHNvY2spCi0gICAgICAgIHJlY29yZCA9IHJlY29yZCArIGZyYWcKLSAgICByZXR1cm4gcmVjb3JkCi0KLQotIyBUcnkgdG8gYmluZCB0byBhIHJlc2VydmVkIHBvcnQgKG11c3QgYmUgcm9vdCkKLQotbGFzdF9yZXN2X3BvcnRfdHJpZWQgPSBOb25lCi1kZWYgYmluZHJlc3Zwb3J0KHNvY2ssIGhvc3QpOgotICAgIGdsb2JhbCBsYXN0X3Jlc3ZfcG9ydF90cmllZAotICAgIEZJUlNULCBMQVNUID0gNjAwLCAxMDI0ICMgUmFuZ2Ugb2YgcG9ydHMgdG8gdHJ5Ci0gICAgaWYgbGFzdF9yZXN2X3BvcnRfdHJpZWQgaXMgTm9uZToKLSAgICAgICAgaW1wb3J0IG9zCi0gICAgICAgIGxhc3RfcmVzdl9wb3J0X3RyaWVkID0gRklSU1QgKyBvcy5nZXRwaWQoKSAlIChMQVNULUZJUlNUKQotICAgIGZvciBpIGluIHJhbmdlKGxhc3RfcmVzdl9wb3J0X3RyaWVkLCBMQVNUKSArIFwKLSAgICAgICAgICAgICAgcmFuZ2UoRklSU1QsIGxhc3RfcmVzdl9wb3J0X3RyaWVkKToKLSAgICAgICAgbGFzdF9yZXN2X3BvcnRfdHJpZWQgPSBpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHNvY2suYmluZCgoaG9zdCwgaSkpCi0gICAgICAgICAgICByZXR1cm4gbGFzdF9yZXN2X3BvcnRfdHJpZWQKLSAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgotICAgICAgICAgICAgKGVycm5vLCBtc2cpID0gZQotICAgICAgICAgICAgaWYgZXJybm8gIT0gMTE0OgotICAgICAgICAgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvcihlcnJubywgbXNnKQotICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignY2FuXCd0IGFzc2lnbiByZXNlcnZlZCBwb3J0JykKLQotCi0jIENsaWVudCB1c2luZyBUQ1AgdG8gYSBzcGVjaWZpYyBwb3J0Ci0KLWNsYXNzIFJhd1RDUENsaWVudChDbGllbnQpOgotCi0gICAgZGVmIG1ha2Vzb2NrZXQoc2VsZik6Ci0gICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKLQotICAgIGRlZiBkb19jYWxsKHNlbGYpOgotICAgICAgICBjYWxsID0gc2VsZi5wYWNrZXIuZ2V0X2J1ZigpCi0gICAgICAgIHNlbmRyZWNvcmQoc2VsZi5zb2NrLCBjYWxsKQotICAgICAgICByZXBseSA9IHJlY3ZyZWNvcmQoc2VsZi5zb2NrKQotICAgICAgICB1ID0gc2VsZi51bnBhY2tlcgotICAgICAgICB1LnJlc2V0KHJlcGx5KQotICAgICAgICB4aWQsIHZlcmYgPSB1LnVucGFja19yZXBseWhlYWRlcigpCi0gICAgICAgIGlmIHhpZCAhPSBzZWxmLmxhc3R4aWQ6Ci0gICAgICAgICAgICAjIENhbid0IHJlYWxseSBoYXBwZW4gc2luY2UgdGhpcyBpcyBUQ1AuLi4KLSAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignd3JvbmcgeGlkIGluIHJlcGx5ICVyIGluc3RlYWQgb2YgJXInICUgKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGlkLCBzZWxmLmxhc3R4aWQpKQotCi0KLSMgQ2xpZW50IHVzaW5nIFVEUCB0byBhIHNwZWNpZmljIHBvcnQKLQotY2xhc3MgUmF3VURQQ2xpZW50KENsaWVudCk6Ci0KLSAgICBkZWYgbWFrZXNvY2tldChzZWxmKToKLSAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCi0KLSAgICBkZWYgZG9fY2FsbChzZWxmKToKLSAgICAgICAgY2FsbCA9IHNlbGYucGFja2VyLmdldF9idWYoKQotICAgICAgICBzZWxmLnNvY2suc2VuZChjYWxsKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmcm9tIHNlbGVjdCBpbXBvcnQgc2VsZWN0Ci0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHByaW50KCdXQVJOSU5HOiBzZWxlY3Qgbm90IGZvdW5kLCBSUEMgbWF5IGhhbmcnKQotICAgICAgICAgICAgc2VsZWN0ID0gTm9uZQotICAgICAgICBCVUZTSVpFID0gODE5MiAjIE1heCBVRFAgYnVmZmVyIHNpemUKLSAgICAgICAgdGltZW91dCA9IDEKLSAgICAgICAgY291bnQgPSA1Ci0gICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICByLCB3LCB4ID0gW3NlbGYuc29ja10sIFtdLCBbXQotICAgICAgICAgICAgaWYgc2VsZWN0OgotICAgICAgICAgICAgICAgIHIsIHcsIHggPSBzZWxlY3QociwgdywgeCwgdGltZW91dCkKLSAgICAgICAgICAgIGlmIHNlbGYuc29jayBub3QgaW4gcjoKLSAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50IC0gMQotICAgICAgICAgICAgICAgIGlmIGNvdW50IDwgMDogcmFpc2UgUnVudGltZUVycm9yKCd0aW1lb3V0JykKLSAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IDwgMjU6IHRpbWVvdXQgPSB0aW1lb3V0ICoyCi0jIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICdSRVNFTkQnLCB0aW1lb3V0LCBjb3VudAotICAgICAgICAgICAgICAgIHNlbGYuc29jay5zZW5kKGNhbGwpCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIHJlcGx5ID0gc2VsZi5zb2NrLnJlY3YoQlVGU0laRSkKLSAgICAgICAgICAgIHUgPSBzZWxmLnVucGFja2VyCi0gICAgICAgICAgICB1LnJlc2V0KHJlcGx5KQotICAgICAgICAgICAgeGlkLCB2ZXJmID0gdS51bnBhY2tfcmVwbHloZWFkZXIoKQotICAgICAgICAgICAgaWYgeGlkICE9IHNlbGYubGFzdHhpZDoKLSMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ0JBRCB4aWQnCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGJyZWFrCi0KLQotIyBDbGllbnQgdXNpbmcgVURQIGJyb2FkY2FzdCB0byBhIHNwZWNpZmljIHBvcnQKLQotY2xhc3MgUmF3QnJvYWRjYXN0VURQQ2xpZW50KFJhd1VEUENsaWVudCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgYmNhc3RhZGRyLCBwcm9nLCB2ZXJzLCBwb3J0KToKLSAgICAgICAgUmF3VURQQ2xpZW50Ll9faW5pdF9fKHNlbGYsIGJjYXN0YWRkciwgcHJvZywgdmVycywgcG9ydCkKLSAgICAgICAgc2VsZi5yZXBseV9oYW5kbGVyID0gTm9uZQotICAgICAgICBzZWxmLnRpbWVvdXQgPSAzMAotCi0gICAgZGVmIGNvbm5zb2NrZXQoc2VsZik6Ci0gICAgICAgICMgRG9uJ3QgY29ubmVjdCAtLSB1c2Ugc2VuZHRvCi0gICAgICAgIHNlbGYuc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fQlJPQURDQVNULCAxKQotCi0gICAgZGVmIHNldF9yZXBseV9oYW5kbGVyKHNlbGYsIHJlcGx5X2hhbmRsZXIpOgotICAgICAgICBzZWxmLnJlcGx5X2hhbmRsZXIgPSByZXBseV9oYW5kbGVyCi0KLSAgICBkZWYgc2V0X3RpbWVvdXQoc2VsZiwgdGltZW91dCk6Ci0gICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQgIyBVc2UgTm9uZSBmb3IgaW5maW5pdGUgdGltZW91dAotCi0gICAgZGVmIG1ha2VfY2FsbChzZWxmLCBwcm9jLCBhcmdzLCBwYWNrX2Z1bmMsIHVucGFja19mdW5jKToKLSAgICAgICAgaWYgcGFja19mdW5jIGlzIE5vbmUgYW5kIGFyZ3MgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ25vbi1udWxsIGFyZ3Mgd2l0aCBudWxsIHBhY2tfZnVuYycpCi0gICAgICAgIHNlbGYuc3RhcnRfY2FsbChwcm9jKQotICAgICAgICBpZiBwYWNrX2Z1bmM6Ci0gICAgICAgICAgICBwYWNrX2Z1bmMoYXJncykKLSAgICAgICAgY2FsbCA9IHNlbGYucGFja2VyLmdldF9idWYoKQotICAgICAgICBzZWxmLnNvY2suc2VuZHRvKGNhbGwsIChzZWxmLmhvc3QsIHNlbGYucG9ydCkpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZyb20gc2VsZWN0IGltcG9ydCBzZWxlY3QKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcHJpbnQoJ1dBUk5JTkc6IHNlbGVjdCBub3QgZm91bmQsIGJyb2FkY2FzdCB3aWxsIGhhbmcnKQotICAgICAgICAgICAgc2VsZWN0ID0gTm9uZQotICAgICAgICBCVUZTSVpFID0gODE5MiAjIE1heCBVRFAgYnVmZmVyIHNpemUgKGZvciByZXBseSkKLSAgICAgICAgcmVwbGllcyA9IFtdCi0gICAgICAgIGlmIHVucGFja19mdW5jIGlzIE5vbmU6Ci0gICAgICAgICAgICBkZWYgZHVtbXkoKTogcGFzcwotICAgICAgICAgICAgdW5wYWNrX2Z1bmMgPSBkdW1teQotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgciwgdywgeCA9IFtzZWxmLnNvY2tdLCBbXSwgW10KLSAgICAgICAgICAgIGlmIHNlbGVjdDoKLSAgICAgICAgICAgICAgICBpZiBzZWxmLnRpbWVvdXQgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgciwgdywgeCA9IHNlbGVjdChyLCB3LCB4KQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHIsIHcsIHggPSBzZWxlY3QociwgdywgeCwgc2VsZi50aW1lb3V0KQotICAgICAgICAgICAgaWYgc2VsZi5zb2NrIG5vdCBpbiByOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICByZXBseSwgZnJvbWFkZHIgPSBzZWxmLnNvY2sucmVjdmZyb20oQlVGU0laRSkKLSAgICAgICAgICAgIHUgPSBzZWxmLnVucGFja2VyCi0gICAgICAgICAgICB1LnJlc2V0KHJlcGx5KQotICAgICAgICAgICAgeGlkLCB2ZXJmID0gdS51bnBhY2tfcmVwbHloZWFkZXIoKQotICAgICAgICAgICAgaWYgeGlkICE9IHNlbGYubGFzdHhpZDoKLSMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ0JBRCB4aWQnCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIHJlcGx5ID0gdW5wYWNrX2Z1bmMoKQotICAgICAgICAgICAgc2VsZi51bnBhY2tlci5kb25lKCkKLSAgICAgICAgICAgIHJlcGxpZXMuYXBwZW5kKChyZXBseSwgZnJvbWFkZHIpKQotICAgICAgICAgICAgaWYgc2VsZi5yZXBseV9oYW5kbGVyOgotICAgICAgICAgICAgICAgIHNlbGYucmVwbHlfaGFuZGxlcihyZXBseSwgZnJvbWFkZHIpCi0gICAgICAgIHJldHVybiByZXBsaWVzCi0KLQotIyBQb3J0IG1hcHBlciBpbnRlcmZhY2UKLQotIyBQcm9ncmFtIG51bWJlciwgdmVyc2lvbiBhbmQgKGZpeGVkISkgcG9ydCBudW1iZXIKLVBNQVBfUFJPRyA9IDEwMDAwMAotUE1BUF9WRVJTID0gMgotUE1BUF9QT1JUID0gMTExCi0KLSMgUHJvY2VkdXJlIG51bWJlcnMKLVBNQVBQUk9DX05VTEwgPSAwICAgICAgICAgICAgICAgICAgICAgICAjICh2b2lkKSAtPiB2b2lkCi1QTUFQUFJPQ19TRVQgPSAxICAgICAgICAgICAgICAgICAgICAgICAgIyAobWFwcGluZykgLT4gYm9vbAotUE1BUFBST0NfVU5TRVQgPSAyICAgICAgICAgICAgICAgICAgICAgICMgKG1hcHBpbmcpIC0+IGJvb2wKLVBNQVBQUk9DX0dFVFBPUlQgPSAzICAgICAgICAgICAgICAgICAgICAjIChtYXBwaW5nKSAtPiB1bnNpZ25lZCBpbnQKLVBNQVBQUk9DX0RVTVAgPSA0ICAgICAgICAgICAgICAgICAgICAgICAjICh2b2lkKSAtPiBwbWFwbGlzdAotUE1BUFBST0NfQ0FMTElUID0gNSAgICAgICAgICAgICAgICAgICAgICMgKGNhbGxfYXJncykgLT4gY2FsbF9yZXN1bHQKLQotIyBBIG1hcHBpbmcgaXMgKHByb2csIHZlcnMsIHByb3QsIHBvcnQpIGFuZCBwcm90IGlzIG9uZSBvZjoKLQotSVBQUk9UT19UQ1AgPSA2Ci1JUFBST1RPX1VEUCA9IDE3Ci0KLSMgQSBwbWFwbGlzdCBpcyBhIHZhcmlhYmxlLWxlbmd0aCBsaXN0IG9mIG1hcHBpbmdzLCBhcyBmb2xsb3dzOgotIyBlaXRoZXIgKDEsIG1hcHBpbmcsIHBtYXBsaXN0KSBvciAoMCkuCi0KLSMgQSBjYWxsX2FyZ3MgaXMgKHByb2csIHZlcnMsIHByb2MsIGFyZ3MpIHdoZXJlIGFyZ3MgaXMgb3BhcXVlOwotIyBhIGNhbGxfcmVzdWx0IGlzIChwb3J0LCByZXMpIHdoZXJlIHJlcyBpcyBvcGFxdWUuCi0KLQotY2xhc3MgUG9ydE1hcHBlclBhY2tlcihQYWNrZXIpOgotCi0gICAgZGVmIHBhY2tfbWFwcGluZyhzZWxmLCBtYXBwaW5nKToKLSAgICAgICAgcHJvZywgdmVycywgcHJvdCwgcG9ydCA9IG1hcHBpbmcKLSAgICAgICAgc2VsZi5wYWNrX3VpbnQocHJvZykKLSAgICAgICAgc2VsZi5wYWNrX3VpbnQodmVycykKLSAgICAgICAgc2VsZi5wYWNrX3VpbnQocHJvdCkKLSAgICAgICAgc2VsZi5wYWNrX3VpbnQocG9ydCkKLQotICAgIGRlZiBwYWNrX3BtYXBsaXN0KHNlbGYsIGxpc3QpOgotICAgICAgICBzZWxmLnBhY2tfbGlzdChsaXN0LCBzZWxmLnBhY2tfbWFwcGluZykKLQotICAgIGRlZiBwYWNrX2NhbGxfYXJncyhzZWxmLCBjYSk6Ci0gICAgICAgIHByb2csIHZlcnMsIHByb2MsIGFyZ3MgPSBjYQotICAgICAgICBzZWxmLnBhY2tfdWludChwcm9nKQotICAgICAgICBzZWxmLnBhY2tfdWludCh2ZXJzKQotICAgICAgICBzZWxmLnBhY2tfdWludChwcm9jKQotICAgICAgICBzZWxmLnBhY2tfb3BhcXVlKGFyZ3MpCi0KLQotY2xhc3MgUG9ydE1hcHBlclVucGFja2VyKFVucGFja2VyKToKLQotICAgIGRlZiB1bnBhY2tfbWFwcGluZyhzZWxmKToKLSAgICAgICAgcHJvZyA9IHNlbGYudW5wYWNrX3VpbnQoKQotICAgICAgICB2ZXJzID0gc2VsZi51bnBhY2tfdWludCgpCi0gICAgICAgIHByb3QgPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgcG9ydCA9IHNlbGYudW5wYWNrX3VpbnQoKQotICAgICAgICByZXR1cm4gcHJvZywgdmVycywgcHJvdCwgcG9ydAotCi0gICAgZGVmIHVucGFja19wbWFwbGlzdChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYudW5wYWNrX2xpc3Qoc2VsZi51bnBhY2tfbWFwcGluZykKLQotICAgIGRlZiB1bnBhY2tfY2FsbF9yZXN1bHQoc2VsZik6Ci0gICAgICAgIHBvcnQgPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgcmVzID0gc2VsZi51bnBhY2tfb3BhcXVlKCkKLSAgICAgICAgcmV0dXJuIHBvcnQsIHJlcwotCi0KLWNsYXNzIFBhcnRpYWxQb3J0TWFwcGVyQ2xpZW50OgotCi0gICAgZGVmIGFkZHBhY2tlcnMoc2VsZik6Ci0gICAgICAgIHNlbGYucGFja2VyID0gUG9ydE1hcHBlclBhY2tlcigpCi0gICAgICAgIHNlbGYudW5wYWNrZXIgPSBQb3J0TWFwcGVyVW5wYWNrZXIoJycpCi0KLSAgICBkZWYgU2V0KHNlbGYsIG1hcHBpbmcpOgotICAgICAgICByZXR1cm4gc2VsZi5tYWtlX2NhbGwoUE1BUFBST0NfU0VULCBtYXBwaW5nLCBcCi0gICAgICAgICAgICAgICAgc2VsZi5wYWNrZXIucGFja19tYXBwaW5nLCBcCi0gICAgICAgICAgICAgICAgc2VsZi51bnBhY2tlci51bnBhY2tfdWludCkKLQotICAgIGRlZiBVbnNldChzZWxmLCBtYXBwaW5nKToKLSAgICAgICAgcmV0dXJuIHNlbGYubWFrZV9jYWxsKFBNQVBQUk9DX1VOU0VULCBtYXBwaW5nLCBcCi0gICAgICAgICAgICAgICAgc2VsZi5wYWNrZXIucGFja19tYXBwaW5nLCBcCi0gICAgICAgICAgICAgICAgc2VsZi51bnBhY2tlci51bnBhY2tfdWludCkKLQotICAgIGRlZiBHZXRwb3J0KHNlbGYsIG1hcHBpbmcpOgotICAgICAgICByZXR1cm4gc2VsZi5tYWtlX2NhbGwoUE1BUFBST0NfR0VUUE9SVCwgbWFwcGluZywgXAotICAgICAgICAgICAgICAgIHNlbGYucGFja2VyLnBhY2tfbWFwcGluZywgXAotICAgICAgICAgICAgICAgIHNlbGYudW5wYWNrZXIudW5wYWNrX3VpbnQpCi0KLSAgICBkZWYgRHVtcChzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYubWFrZV9jYWxsKFBNQVBQUk9DX0RVTVAsIE5vbmUsIFwKLSAgICAgICAgICAgICAgICBOb25lLCBcCi0gICAgICAgICAgICAgICAgc2VsZi51bnBhY2tlci51bnBhY2tfcG1hcGxpc3QpCi0KLSAgICBkZWYgQ2FsbGl0KHNlbGYsIGNhKToKLSAgICAgICAgcmV0dXJuIHNlbGYubWFrZV9jYWxsKFBNQVBQUk9DX0NBTExJVCwgY2EsIFwKLSAgICAgICAgICAgICAgICBzZWxmLnBhY2tlci5wYWNrX2NhbGxfYXJncywgXAotICAgICAgICAgICAgICAgIHNlbGYudW5wYWNrZXIudW5wYWNrX2NhbGxfcmVzdWx0KQotCi0KLWNsYXNzIFRDUFBvcnRNYXBwZXJDbGllbnQoUGFydGlhbFBvcnRNYXBwZXJDbGllbnQsIFJhd1RDUENsaWVudCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCk6Ci0gICAgICAgIFJhd1RDUENsaWVudC5fX2luaXRfXyhzZWxmLCBcCi0gICAgICAgICAgICAgICAgaG9zdCwgUE1BUF9QUk9HLCBQTUFQX1ZFUlMsIFBNQVBfUE9SVCkKLQotCi1jbGFzcyBVRFBQb3J0TWFwcGVyQ2xpZW50KFBhcnRpYWxQb3J0TWFwcGVyQ2xpZW50LCBSYXdVRFBDbGllbnQpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QpOgotICAgICAgICBSYXdVRFBDbGllbnQuX19pbml0X18oc2VsZiwgXAotICAgICAgICAgICAgICAgIGhvc3QsIFBNQVBfUFJPRywgUE1BUF9WRVJTLCBQTUFQX1BPUlQpCi0KLQotY2xhc3MgQnJvYWRjYXN0VURQUG9ydE1hcHBlckNsaWVudChQYXJ0aWFsUG9ydE1hcHBlckNsaWVudCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdCcm9hZGNhc3RVRFBDbGllbnQpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGJjYXN0YWRkcik6Ci0gICAgICAgIFJhd0Jyb2FkY2FzdFVEUENsaWVudC5fX2luaXRfXyhzZWxmLCBcCi0gICAgICAgICAgICAgICAgYmNhc3RhZGRyLCBQTUFQX1BST0csIFBNQVBfVkVSUywgUE1BUF9QT1JUKQotCi0KLSMgR2VuZXJpYyBjbGllbnRzIHRoYXQgZmluZCB0aGVpciBzZXJ2ZXIgdGhyb3VnaCB0aGUgUG9ydCBtYXBwZXIKLQotY2xhc3MgVENQQ2xpZW50KFJhd1RDUENsaWVudCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcHJvZywgdmVycyk6Ci0gICAgICAgIHBtYXAgPSBUQ1BQb3J0TWFwcGVyQ2xpZW50KGhvc3QpCi0gICAgICAgIHBvcnQgPSBwbWFwLkdldHBvcnQoKHByb2csIHZlcnMsIElQUFJPVE9fVENQLCAwKSkKLSAgICAgICAgcG1hcC5jbG9zZSgpCi0gICAgICAgIGlmIHBvcnQgPT0gMDoKLSAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigncHJvZ3JhbSBub3QgcmVnaXN0ZXJlZCcpCi0gICAgICAgIFJhd1RDUENsaWVudC5fX2luaXRfXyhzZWxmLCBob3N0LCBwcm9nLCB2ZXJzLCBwb3J0KQotCi0KLWNsYXNzIFVEUENsaWVudChSYXdVRFBDbGllbnQpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHByb2csIHZlcnMpOgotICAgICAgICBwbWFwID0gVURQUG9ydE1hcHBlckNsaWVudChob3N0KQotICAgICAgICBwb3J0ID0gcG1hcC5HZXRwb3J0KChwcm9nLCB2ZXJzLCBJUFBST1RPX1VEUCwgMCkpCi0gICAgICAgIHBtYXAuY2xvc2UoKQotICAgICAgICBpZiBwb3J0ID09IDA6Ci0gICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ3Byb2dyYW0gbm90IHJlZ2lzdGVyZWQnKQotICAgICAgICBSYXdVRFBDbGllbnQuX19pbml0X18oc2VsZiwgaG9zdCwgcHJvZywgdmVycywgcG9ydCkKLQotCi1jbGFzcyBCcm9hZGNhc3RVRFBDbGllbnQoQ2xpZW50KToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiY2FzdGFkZHIsIHByb2csIHZlcnMpOgotICAgICAgICBzZWxmLnBtYXAgPSBCcm9hZGNhc3RVRFBQb3J0TWFwcGVyQ2xpZW50KGJjYXN0YWRkcikKLSAgICAgICAgc2VsZi5wbWFwLnNldF9yZXBseV9oYW5kbGVyKHNlbGYubXlfcmVwbHlfaGFuZGxlcikKLSAgICAgICAgc2VsZi5wcm9nID0gcHJvZwotICAgICAgICBzZWxmLnZlcnMgPSB2ZXJzCi0gICAgICAgIHNlbGYudXNlcl9yZXBseV9oYW5kbGVyID0gTm9uZQotICAgICAgICBzZWxmLmFkZHBhY2tlcnMoKQotCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBzZWxmLnBtYXAuY2xvc2UoKQotCi0gICAgZGVmIHNldF9yZXBseV9oYW5kbGVyKHNlbGYsIHJlcGx5X2hhbmRsZXIpOgotICAgICAgICBzZWxmLnVzZXJfcmVwbHlfaGFuZGxlciA9IHJlcGx5X2hhbmRsZXIKLQotICAgIGRlZiBzZXRfdGltZW91dChzZWxmLCB0aW1lb3V0KToKLSAgICAgICAgc2VsZi5wbWFwLnNldF90aW1lb3V0KHRpbWVvdXQpCi0KLSAgICBkZWYgbXlfcmVwbHlfaGFuZGxlcihzZWxmLCByZXBseSwgZnJvbWFkZHIpOgotICAgICAgICBwb3J0LCByZXMgPSByZXBseQotICAgICAgICBzZWxmLnVucGFja2VyLnJlc2V0KHJlcykKLSAgICAgICAgcmVzdWx0ID0gc2VsZi51bnBhY2tfZnVuYygpCi0gICAgICAgIHNlbGYudW5wYWNrZXIuZG9uZSgpCi0gICAgICAgIHNlbGYucmVwbGllcy5hcHBlbmQoKHJlc3VsdCwgZnJvbWFkZHIpKQotICAgICAgICBpZiBzZWxmLnVzZXJfcmVwbHlfaGFuZGxlciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYudXNlcl9yZXBseV9oYW5kbGVyKHJlc3VsdCwgZnJvbWFkZHIpCi0KLSAgICBkZWYgbWFrZV9jYWxsKHNlbGYsIHByb2MsIGFyZ3MsIHBhY2tfZnVuYywgdW5wYWNrX2Z1bmMpOgotICAgICAgICBzZWxmLnBhY2tlci5yZXNldCgpCi0gICAgICAgIGlmIHBhY2tfZnVuYzoKLSAgICAgICAgICAgIHBhY2tfZnVuYyhhcmdzKQotICAgICAgICBpZiB1bnBhY2tfZnVuYyBpcyBOb25lOgotICAgICAgICAgICAgZGVmIGR1bW15KCk6IHBhc3MKLSAgICAgICAgICAgIHNlbGYudW5wYWNrX2Z1bmMgPSBkdW1teQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi51bnBhY2tfZnVuYyA9IHVucGFja19mdW5jCi0gICAgICAgIHNlbGYucmVwbGllcyA9IFtdCi0gICAgICAgIHBhY2tlZF9hcmdzID0gc2VsZi5wYWNrZXIuZ2V0X2J1ZigpCi0gICAgICAgIGR1bW15X3JlcGxpZXMgPSBzZWxmLnBtYXAuQ2FsbGl0KCBcCi0gICAgICAgICAgICAgICAgKHNlbGYucHJvZywgc2VsZi52ZXJzLCBwcm9jLCBwYWNrZWRfYXJncykpCi0gICAgICAgIHJldHVybiBzZWxmLnJlcGxpZXMKLQotCi0jIFNlcnZlciBjbGFzc2VzCi0KLSMgVGhlc2UgYXJlIG5vdCBzeW1tZXRyaWMgdG8gdGhlIENsaWVudCBjbGFzc2VzCi0jIFhYWCBObyBhdHRlbXB0IGlzIG1hZGUgdG8gcHJvdmlkZSBhdXRob3JpemF0aW9uIGhvb2tzIHlldAotCi1jbGFzcyBTZXJ2ZXI6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcHJvZywgdmVycywgcG9ydCk6Ci0gICAgICAgIHNlbGYuaG9zdCA9IGhvc3QgIyBTaG91bGQgbm9ybWFsbHkgYmUgJycgZm9yIGRlZmF1bHQgaW50ZXJmYWNlCi0gICAgICAgIHNlbGYucHJvZyA9IHByb2cKLSAgICAgICAgc2VsZi52ZXJzID0gdmVycwotICAgICAgICBzZWxmLnBvcnQgPSBwb3J0ICMgU2hvdWxkIG5vcm1hbGx5IGJlIDAgZm9yIHJhbmRvbSBwb3J0Ci0gICAgICAgIHNlbGYubWFrZXNvY2tldCgpICMgQXNzaWducyB0byBzZWxmLnNvY2sgYW5kIHNlbGYucHJvdAotICAgICAgICBzZWxmLmJpbmRzb2NrZXQoKQotICAgICAgICBzZWxmLmhvc3QsIHNlbGYucG9ydCA9IHNlbGYuc29jay5nZXRzb2NrbmFtZSgpCi0gICAgICAgIHNlbGYuYWRkcGFja2VycygpCi0KLSAgICBkZWYgcmVnaXN0ZXIoc2VsZik6Ci0gICAgICAgIG1hcHBpbmcgPSBzZWxmLnByb2csIHNlbGYudmVycywgc2VsZi5wcm90LCBzZWxmLnBvcnQKLSAgICAgICAgcCA9IFRDUFBvcnRNYXBwZXJDbGllbnQoc2VsZi5ob3N0KQotICAgICAgICBpZiBub3QgcC5TZXQobWFwcGluZyk6Ci0gICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ3JlZ2lzdGVyIGZhaWxlZCcpCi0KLSAgICBkZWYgdW5yZWdpc3RlcihzZWxmKToKLSAgICAgICAgbWFwcGluZyA9IHNlbGYucHJvZywgc2VsZi52ZXJzLCBzZWxmLnByb3QsIHNlbGYucG9ydAotICAgICAgICBwID0gVENQUG9ydE1hcHBlckNsaWVudChzZWxmLmhvc3QpCi0gICAgICAgIGlmIG5vdCBwLlVuc2V0KG1hcHBpbmcpOgotICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCd1bnJlZ2lzdGVyIGZhaWxlZCcpCi0KLSAgICBkZWYgaGFuZGxlKHNlbGYsIGNhbGwpOgotICAgICAgICAjIERvbid0IHVzZSB1bnBhY2tfaGVhZGVyIGJ1dCBwYXJzZSB0aGUgaGVhZGVyIHBpZWNld2lzZQotICAgICAgICAjIFhYWCBJIGhhdmUgbm8gaWRlYSBpZiBJIGFtIHVzaW5nIHRoZSByaWdodCBlcnJvciByZXNwb25zZXMhCi0gICAgICAgIHNlbGYudW5wYWNrZXIucmVzZXQoY2FsbCkKLSAgICAgICAgc2VsZi5wYWNrZXIucmVzZXQoKQotICAgICAgICB4aWQgPSBzZWxmLnVucGFja2VyLnVucGFja191aW50KCkKLSAgICAgICAgc2VsZi5wYWNrZXIucGFja191aW50KHhpZCkKLSAgICAgICAgdGVtcCA9IHNlbGYudW5wYWNrZXIudW5wYWNrX2VudW0oKQotICAgICAgICBpZiB0ZW1wICE9IENBTEw6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZSAjIE5vdCB3b3J0aHkgb2YgYSByZXBseQotICAgICAgICBzZWxmLnBhY2tlci5wYWNrX3VpbnQoUkVQTFkpCi0gICAgICAgIHRlbXAgPSBzZWxmLnVucGFja2VyLnVucGFja191aW50KCkKLSAgICAgICAgaWYgdGVtcCAhPSBSUENWRVJTSU9OOgotICAgICAgICAgICAgc2VsZi5wYWNrZXIucGFja191aW50KE1TR19ERU5JRUQpCi0gICAgICAgICAgICBzZWxmLnBhY2tlci5wYWNrX3VpbnQoUlBDX01JU01BVENIKQotICAgICAgICAgICAgc2VsZi5wYWNrZXIucGFja191aW50KFJQQ1ZFUlNJT04pCi0gICAgICAgICAgICBzZWxmLnBhY2tlci5wYWNrX3VpbnQoUlBDVkVSU0lPTikKLSAgICAgICAgICAgIHJldHVybiBzZWxmLnBhY2tlci5nZXRfYnVmKCkKLSAgICAgICAgc2VsZi5wYWNrZXIucGFja191aW50KE1TR19BQ0NFUFRFRCkKLSAgICAgICAgc2VsZi5wYWNrZXIucGFja19hdXRoKChBVVRIX05VTEwsIG1ha2VfYXV0aF9udWxsKCkpKQotICAgICAgICBwcm9nID0gc2VsZi51bnBhY2tlci51bnBhY2tfdWludCgpCi0gICAgICAgIGlmIHByb2cgIT0gc2VsZi5wcm9nOgotICAgICAgICAgICAgc2VsZi5wYWNrZXIucGFja191aW50KFBST0dfVU5BVkFJTCkKLSAgICAgICAgICAgIHJldHVybiBzZWxmLnBhY2tlci5nZXRfYnVmKCkKLSAgICAgICAgdmVycyA9IHNlbGYudW5wYWNrZXIudW5wYWNrX3VpbnQoKQotICAgICAgICBpZiB2ZXJzICE9IHNlbGYudmVyczoKLSAgICAgICAgICAgIHNlbGYucGFja2VyLnBhY2tfdWludChQUk9HX01JU01BVENIKQotICAgICAgICAgICAgc2VsZi5wYWNrZXIucGFja191aW50KHNlbGYudmVycykKLSAgICAgICAgICAgIHNlbGYucGFja2VyLnBhY2tfdWludChzZWxmLnZlcnMpCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5wYWNrZXIuZ2V0X2J1ZigpCi0gICAgICAgIHByb2MgPSBzZWxmLnVucGFja2VyLnVucGFja191aW50KCkKLSAgICAgICAgbWV0aG5hbWUgPSAnaGFuZGxlXycgKyByZXByKHByb2MpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYsIG1ldGhuYW1lKQotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICBzZWxmLnBhY2tlci5wYWNrX3VpbnQoUFJPQ19VTkFWQUlMKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFja2VyLmdldF9idWYoKQotICAgICAgICBjcmVkID0gc2VsZi51bnBhY2tlci51bnBhY2tfYXV0aCgpCi0gICAgICAgIHZlcmYgPSBzZWxmLnVucGFja2VyLnVucGFja19hdXRoKCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbWV0aCgpICMgVW5wYWNrIGFyZ3MsIGNhbGwgdHVybl9hcm91bmQoKSwgcGFjayByZXBseQotICAgICAgICBleGNlcHQgKEVPRkVycm9yLCBHYXJiYWdlQXJncyk6Ci0gICAgICAgICAgICAjIFRvbyBmZXcgb3IgdG9vIG1hbnkgYXJndW1lbnRzCi0gICAgICAgICAgICBzZWxmLnBhY2tlci5yZXNldCgpCi0gICAgICAgICAgICBzZWxmLnBhY2tlci5wYWNrX3VpbnQoeGlkKQotICAgICAgICAgICAgc2VsZi5wYWNrZXIucGFja191aW50KFJFUExZKQotICAgICAgICAgICAgc2VsZi5wYWNrZXIucGFja191aW50KE1TR19BQ0NFUFRFRCkKLSAgICAgICAgICAgIHNlbGYucGFja2VyLnBhY2tfYXV0aCgoQVVUSF9OVUxMLCBtYWtlX2F1dGhfbnVsbCgpKSkKLSAgICAgICAgICAgIHNlbGYucGFja2VyLnBhY2tfdWludChHQVJCQUdFX0FSR1MpCi0gICAgICAgIHJldHVybiBzZWxmLnBhY2tlci5nZXRfYnVmKCkKLQotICAgIGRlZiB0dXJuX2Fyb3VuZChzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi51bnBhY2tlci5kb25lKCkKLSAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIEdhcmJhZ2VBcmdzCi0gICAgICAgIHNlbGYucGFja2VyLnBhY2tfdWludChTVUNDRVNTKQotCi0gICAgZGVmIGhhbmRsZV8wKHNlbGYpOiAjIEhhbmRsZSBOVUxMIG1lc3NhZ2UKLSAgICAgICAgc2VsZi50dXJuX2Fyb3VuZCgpCi0KLSAgICBkZWYgbWFrZXNvY2tldChzZWxmKToKLSAgICAgICAgIyBUaGlzIE1VU1QgYmUgb3ZlcnJpZGRlbgotICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ21ha2Vzb2NrZXQgbm90IGRlZmluZWQnKQotCi0gICAgZGVmIGJpbmRzb2NrZXQoc2VsZik6Ci0gICAgICAgICMgT3ZlcnJpZGUgdGhpcyB0byBiaW5kIHRvIGEgZGlmZmVyZW50IHBvcnQgKGUuZy4gcmVzZXJ2ZWQpCi0gICAgICAgIHNlbGYuc29jay5iaW5kKChzZWxmLmhvc3QsIHNlbGYucG9ydCkpCi0KLSAgICBkZWYgYWRkcGFja2VycyhzZWxmKToKLSAgICAgICAgIyBPdmVycmlkZSB0aGlzIHRvIHVzZSBkZXJpdmVkIGNsYXNzZXMgZnJvbSBQYWNrZXIvVW5wYWNrZXIKLSAgICAgICAgc2VsZi5wYWNrZXIgPSBQYWNrZXIoKQotICAgICAgICBzZWxmLnVucGFja2VyID0gVW5wYWNrZXIoJycpCi0KLQotY2xhc3MgVENQU2VydmVyKFNlcnZlcik6Ci0KLSAgICBkZWYgbWFrZXNvY2tldChzZWxmKToKLSAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQotICAgICAgICBzZWxmLnByb3QgPSBJUFBST1RPX1RDUAotCi0gICAgZGVmIGxvb3Aoc2VsZik6Ci0gICAgICAgIHNlbGYuc29jay5saXN0ZW4oMCkKLSAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIHNlbGYuc2Vzc2lvbihzZWxmLnNvY2suYWNjZXB0KCkpCi0KLSAgICBkZWYgc2Vzc2lvbihzZWxmLCBjb25uZWN0aW9uKToKLSAgICAgICAgc29jaywgKGhvc3QsIHBvcnQpID0gY29ubmVjdGlvbgotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNhbGwgPSByZWN2cmVjb3JkKHNvY2spCi0gICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgbXNnOgotICAgICAgICAgICAgICAgIHByaW50KCdzb2NrZXQgZXJyb3I6JywgbXNnKQotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICByZXBseSA9IHNlbGYuaGFuZGxlKGNhbGwpCi0gICAgICAgICAgICBpZiByZXBseSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBzZW5kcmVjb3JkKHNvY2ssIHJlcGx5KQotCi0gICAgZGVmIGZvcmtpbmdsb29wKHNlbGYpOgotICAgICAgICAjIExpa2UgbG9vcCBidXQgdXNlcyBmb3Jrc2Vzc2lvbigpCi0gICAgICAgIHNlbGYuc29jay5saXN0ZW4oMCkKLSAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIHNlbGYuZm9ya3Nlc3Npb24oc2VsZi5zb2NrLmFjY2VwdCgpKQotCi0gICAgZGVmIGZvcmtzZXNzaW9uKHNlbGYsIGNvbm5lY3Rpb24pOgotICAgICAgICAjIExpa2Ugc2Vzc2lvbiBidXQgZm9ya3Mgb2ZmIGEgc3VicHJvY2VzcwotICAgICAgICBpbXBvcnQgb3MKLSAgICAgICAgIyBXYWl0IGZvciBkZWNlYXNlZCBjaGlsZHJlbgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgICAgIHBpZCwgc3RzID0gb3Mud2FpdHBpZCgwLCAxKQotICAgICAgICBleGNlcHQgb3MuZXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIHBpZCA9IE5vbmUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcGlkID0gb3MuZm9yaygpCi0gICAgICAgICAgICBpZiBwaWQ6ICMgUGFyZW50Ci0gICAgICAgICAgICAgICAgY29ubmVjdGlvblswXS5jbG9zZSgpCi0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAjIENoaWxkCi0gICAgICAgICAgICBzZWxmLnNlc3Npb24oY29ubmVjdGlvbikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICMgTWFrZSBzdXJlIHdlIGRvbid0IGZhbGwgdGhyb3VnaCBpbiB0aGUgcGFyZW50Ci0gICAgICAgICAgICBpZiBwaWQgPT0gMDoKLSAgICAgICAgICAgICAgICBvcy5fZXhpdCgwKQotCi0KLWNsYXNzIFVEUFNlcnZlcihTZXJ2ZXIpOgotCi0gICAgZGVmIG1ha2Vzb2NrZXQoc2VsZik6Ci0gICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX0RHUkFNKQotICAgICAgICBzZWxmLnByb3QgPSBJUFBST1RPX1VEUAotCi0gICAgZGVmIGxvb3Aoc2VsZik6Ci0gICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICBzZWxmLnNlc3Npb24oKQotCi0gICAgZGVmIHNlc3Npb24oc2VsZik6Ci0gICAgICAgIGNhbGwsIGhvc3RfcG9ydCA9IHNlbGYuc29jay5yZWN2ZnJvbSg4MTkyKQotICAgICAgICByZXBseSA9IHNlbGYuaGFuZGxlKGNhbGwpCi0gICAgICAgIGlmIHJlcGx5IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5zb2NrLnNlbmR0byhyZXBseSwgaG9zdF9wb3J0KQotCi0KLSMgU2ltcGxlIHRlc3QgcHJvZ3JhbSAtLSBkdW1wIGxvY2FsIHBvcnRtYXBwZXIgc3RhdHVzCi0KLWRlZiB0ZXN0KCk6Ci0gICAgcG1hcCA9IFVEUFBvcnRNYXBwZXJDbGllbnQoJycpCi0gICAgbGlzdCA9IHBtYXAuRHVtcCgpCi0gICAgbGlzdC5zb3J0KCkKLSAgICBmb3IgcHJvZywgdmVycywgcHJvdCwgcG9ydCBpbiBsaXN0OgotICAgICAgICBwcmludChwcm9nLCB2ZXJzLCBlbmQ9JyAnKQotICAgICAgICBpZiBwcm90ID09IElQUFJPVE9fVENQOiBwcmludCgndGNwJywgZW5kPScgJykKLSAgICAgICAgZWxpZiBwcm90ID09IElQUFJPVE9fVURQOiBwcmludCgndWRwJywgZW5kPScgJykKLSAgICAgICAgZWxzZTogcHJpbnQocHJvdCwgZW5kPScgJykKLSAgICAgICAgcHJpbnQocG9ydCkKLQotCi0jIFRlc3QgcHJvZ3JhbSBmb3IgYnJvYWRjYXN0IG9wZXJhdGlvbiAtLSBkdW1wIGV2ZXJ5Ym9keSdzIHBvcnRtYXBwZXIgc3RhdHVzCi0KLWRlZiB0ZXN0YmNhc3QoKToKLSAgICBpbXBvcnQgc3lzCi0gICAgaWYgc3lzLmFyZ3ZbMTpdOgotICAgICAgICBiY2FzdGFkZHIgPSBzeXMuYXJndlsxXQotICAgIGVsc2U6Ci0gICAgICAgIGJjYXN0YWRkciA9ICc8YnJvYWRjYXN0PicKLSAgICBkZWYgcmgocmVwbHksIGZyb21hZGRyKToKLSAgICAgICAgaG9zdCwgcG9ydCA9IGZyb21hZGRyCi0gICAgICAgIHByaW50KGhvc3QgKyAnXHQnICsgcmVwcihyZXBseSkpCi0gICAgcG1hcCA9IEJyb2FkY2FzdFVEUFBvcnRNYXBwZXJDbGllbnQoYmNhc3RhZGRyKQotICAgIHBtYXAuc2V0X3JlcGx5X2hhbmRsZXIocmgpCi0gICAgcG1hcC5zZXRfdGltZW91dCg1KQotICAgIHJlcGxpZXMgPSBwbWFwLkdldHBvcnQoKDEwMDAwMiwgMSwgSVBQUk9UT19VRFAsIDApKQotCi0KLSMgVGVzdCBwcm9ncmFtIGZvciBzZXJ2ZXIsIHdpdGggY29ycmVzcG9uZGluZyBjbGllbnQKLSMgT24gbWFjaGluZSBBOiBweXRob24gLWMgJ2ltcG9ydCBycGM7IHJwYy50ZXN0c3ZyKCknCi0jIE9uIG1hY2hpbmUgQjogcHl0aG9uIC1jICdpbXBvcnQgcnBjOyBycGMudGVzdGNsdCgpJyBBCi0jIChBIG1heSBiZSA9PSBCKQotCi1kZWYgdGVzdHN2cigpOgotICAgICMgU2ltcGxlIHRlc3QgY2xhc3MgLS0gcHJvYyAxIGRvdWJsZXMgaXRzIHN0cmluZyBhcmd1bWVudCBhcyByZXBseQotICAgIGNsYXNzIFMoVURQU2VydmVyKToKLSAgICAgICAgZGVmIGhhbmRsZV8xKHNlbGYpOgotICAgICAgICAgICAgYXJnID0gc2VsZi51bnBhY2tlci51bnBhY2tfc3RyaW5nKCkKLSAgICAgICAgICAgIHNlbGYudHVybl9hcm91bmQoKQotICAgICAgICAgICAgcHJpbnQoJ1JQQyBmdW5jdGlvbiAxIGNhbGxlZCwgYXJnJywgcmVwcihhcmcpKQotICAgICAgICAgICAgc2VsZi5wYWNrZXIucGFja19zdHJpbmcoYXJnICsgYXJnKQotICAgICMKLSAgICBzID0gUygnJywgMHgyMDAwMDAwMCwgMSwgMCkKLSAgICB0cnk6Ci0gICAgICAgIHMudW5yZWdpc3RlcigpCi0gICAgZXhjZXB0IFJ1bnRpbWVFcnJvciBhcyBtc2c6Ci0gICAgICAgIHByaW50KCdSdW50aW1lRXJyb3I6JywgbXNnLCAnKGlnbm9yZWQpJykKLSAgICBzLnJlZ2lzdGVyKCkKLSAgICBwcmludCgnU2VydmljZSBzdGFydGVkLi4uJykKLSAgICB0cnk6Ci0gICAgICAgIHMubG9vcCgpCi0gICAgZmluYWxseToKLSAgICAgICAgcy51bnJlZ2lzdGVyKCkKLSAgICAgICAgcHJpbnQoJ1NlcnZpY2UgaW50ZXJydXB0ZWQuJykKLQotCi1kZWYgdGVzdGNsdCgpOgotICAgIGltcG9ydCBzeXMKLSAgICBpZiBzeXMuYXJndlsxOl06IGhvc3QgPSBzeXMuYXJndlsxXQotICAgIGVsc2U6IGhvc3QgPSAnJwotICAgICMgQ2xpZW50IGZvciBhYm92ZSBzZXJ2ZXIKLSAgICBjbGFzcyBDKFVEUENsaWVudCk6Ci0gICAgICAgIGRlZiBjYWxsXzEoc2VsZiwgYXJnKToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLm1ha2VfY2FsbCgxLCBhcmcsIFwKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWNrZXIucGFja19zdHJpbmcsIFwKLSAgICAgICAgICAgICAgICAgICAgc2VsZi51bnBhY2tlci51bnBhY2tfc3RyaW5nKQotICAgIGMgPSBDKGhvc3QsIDB4MjAwMDAwMDAsIDEpCi0gICAgcHJpbnQoJ21ha2luZyBjYWxsLi4uJykKLSAgICByZXBseSA9IGMuY2FsbF8xKCdoZWxsbywgd29ybGQsICcpCi0gICAgcHJpbnQoJ2NhbGwgcmV0dXJuZWQnLCByZXByKHJlcGx5KSkKZGlmZiAtLWdpdCBhL0RlbW8vcnBjL3Rlc3QgYi9EZW1vL3JwYy90ZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiYTIyMGYyLi4wMDAwMDAwCi0tLSBhL0RlbW8vcnBjL3Rlc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi06ICR7UFlUSE9OPXB5dGhvbn0KLTogJHtTRVJWRVI9Y2hhcm9uLmN3aS5ubH0KLQotc2V0IC14ZQotCi0kUFlUSE9OIC1jICdmcm9tIHJwYyBpbXBvcnQgdGVzdDsgdGVzdCgpJwotJFBZVEhPTiAtYyAnZnJvbSBycGMgaW1wb3J0IHRlc3Q7IHRlc3QoKScgJHtTRVJWRVJ9Ci0KLSRQWVRIT04gLWMgJ2Zyb20gcnBjIGltcG9ydCB0ZXN0c3ZyOyB0ZXN0c3ZyKCknICYKLVBJRD0kIQotc2xlZXAgMgotJFBZVEhPTiAtYyAnZnJvbSBycGMgaW1wb3J0IHRlc3RjbHQ7IHRlc3RjbHQoKScKLWtpbGwgLTIgJFBJRAotCi0kUFlUSE9OIC1jICdmcm9tIG1vdW50Y2xpZW50IGltcG9ydCB0ZXN0OyB0ZXN0KCknCi0kUFlUSE9OIC1jICdmcm9tIG1vdW50Y2xpZW50IGltcG9ydCB0ZXN0OyB0ZXN0KCknIGdhdGVrZWVwZXIuZGVjLmNvbQotCi0kUFlUSE9OIC1jICdmcm9tIG5mc2NsaWVudCBpbXBvcnQgdGVzdDsgdGVzdCgpJwotJFBZVEhPTiAtYyAnZnJvbSBuZnNjbGllbnQgaW1wb3J0IHRlc3Q7IHRlc3QoKScgZ2F0ZWtlZXBlci5kZWMuY29tCi0kUFlUSE9OIC1jICdmcm9tIG5mc2NsaWVudCBpbXBvcnQgdGVzdDsgdGVzdCgpJyBnYXRla2VlcGVyLmRlYy5jb20gL2FyY2hpdmUKLQotJFBZVEhPTiAtYyAnZnJvbSBybnVzZXJzY2xpZW50IGltcG9ydCB0ZXN0OyB0ZXN0KCknICcnCi0KLSRQWVRIT04gLWMgJ2Zyb20gcnBjIGltcG9ydCB0ZXN0YmNhc3Q7IHRlc3RiY2FzdCgpJwpkaWZmIC0tZ2l0IGEvRGVtby9ycGMveGRyLnB5IGIvRGVtby9ycGMveGRyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDVmOWMzLi4wMDAwMDAwCi0tLSBhL0RlbW8vcnBjL3hkci5weQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0jIEltcGxlbWVudCAoYSBzdWJzZXQgb2YpIFN1biBYRFIgLS0gUkZDMTAxNC4KLQotCi10cnk6Ci0gICAgaW1wb3J0IHN0cnVjdAotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIHN0cnVjdCA9IE5vbmUKLQotCi1Mb25nID0gdHlwZSgwKQotCi0KLWNsYXNzIFBhY2tlcjoKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5yZXNldCgpCi0KLSAgICBkZWYgcmVzZXQoc2VsZik6Ci0gICAgICAgIHNlbGYuYnVmID0gJycKLQotICAgIGRlZiBnZXRfYnVmKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5idWYKLQotICAgIGRlZiBwYWNrX3VpbnQoc2VsZiwgeCk6Ci0gICAgICAgIHNlbGYuYnVmID0gc2VsZi5idWYgKyBcCi0gICAgICAgICAgICAgICAgKGNocihpbnQoeD4+MjQgJiAweGZmKSkgKyBjaHIoaW50KHg+PjE2ICYgMHhmZikpICsgXAotICAgICAgICAgICAgICAgICBjaHIoaW50KHg+PjggJiAweGZmKSkgKyBjaHIoaW50KHggJiAweGZmKSkpCi0gICAgaWYgc3RydWN0IGFuZCBzdHJ1Y3QucGFjaygnbCcsIDEpID09ICdcMFwwXDBcMSc6Ci0gICAgICAgIGRlZiBwYWNrX3VpbnQoc2VsZiwgeCk6Ci0gICAgICAgICAgICBpZiB0eXBlKHgpID09IExvbmc6Ci0gICAgICAgICAgICAgICAgeCA9IGludCgoeCArIDB4ODAwMDAwMDApICUgMHgxMDAwMDAwMDAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAweDgwMDAwMDAwKQotICAgICAgICAgICAgc2VsZi5idWYgPSBzZWxmLmJ1ZiArIHN0cnVjdC5wYWNrKCdsJywgeCkKLQotICAgIHBhY2tfaW50ID0gcGFja191aW50Ci0KLSAgICBwYWNrX2VudW0gPSBwYWNrX2ludAotCi0gICAgZGVmIHBhY2tfYm9vbChzZWxmLCB4KToKLSAgICAgICAgaWYgeDogc2VsZi5idWYgPSBzZWxmLmJ1ZiArICdcMFwwXDBcMScKLSAgICAgICAgZWxzZTogc2VsZi5idWYgPSBzZWxmLmJ1ZiArICdcMFwwXDBcMCcKLQotICAgIGRlZiBwYWNrX3VoeXBlcihzZWxmLCB4KToKLSAgICAgICAgc2VsZi5wYWNrX3VpbnQoaW50KHg+PjMyICYgMHhmZmZmZmZmZikpCi0gICAgICAgIHNlbGYucGFja191aW50KGludCh4ICYgMHhmZmZmZmZmZikpCi0KLSAgICBwYWNrX2h5cGVyID0gcGFja191aHlwZXIKLQotICAgIGRlZiBwYWNrX2Zsb2F0KHNlbGYsIHgpOgotICAgICAgICAjIFhYWAotICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuYnVmICsgc3RydWN0LnBhY2soJ2YnLCB4KQotCi0gICAgZGVmIHBhY2tfZG91YmxlKHNlbGYsIHgpOgotICAgICAgICAjIFhYWAotICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuYnVmICsgc3RydWN0LnBhY2soJ2QnLCB4KQotCi0gICAgZGVmIHBhY2tfZnN0cmluZyhzZWxmLCBuLCBzKToKLSAgICAgICAgaWYgbiA8IDA6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmc3RyaW5nIHNpemUgbXVzdCBiZSBub25uZWdhdGl2ZScpCi0gICAgICAgIG4gPSAoKG4gKyAzKS8vNCkqNAotICAgICAgICBkYXRhID0gc1s6bl0KLSAgICAgICAgZGF0YSA9IGRhdGEgKyAobiAtIGxlbihkYXRhKSkgKiAnXDAnCi0gICAgICAgIHNlbGYuYnVmID0gc2VsZi5idWYgKyBkYXRhCi0KLSAgICBwYWNrX2ZvcGFxdWUgPSBwYWNrX2ZzdHJpbmcKLQotICAgIGRlZiBwYWNrX3N0cmluZyhzZWxmLCBzKToKLSAgICAgICAgbiA9IGxlbihzKQotICAgICAgICBzZWxmLnBhY2tfdWludChuKQotICAgICAgICBzZWxmLnBhY2tfZnN0cmluZyhuLCBzKQotCi0gICAgcGFja19vcGFxdWUgPSBwYWNrX3N0cmluZwotCi0gICAgZGVmIHBhY2tfbGlzdChzZWxmLCBsaXN0LCBwYWNrX2l0ZW0pOgotICAgICAgICBmb3IgaXRlbSBpbiBsaXN0OgotICAgICAgICAgICAgc2VsZi5wYWNrX3VpbnQoMSkKLSAgICAgICAgICAgIHBhY2tfaXRlbShpdGVtKQotICAgICAgICBzZWxmLnBhY2tfdWludCgwKQotCi0gICAgZGVmIHBhY2tfZmFycmF5KHNlbGYsIG4sIGxpc3QsIHBhY2tfaXRlbSk6Ci0gICAgICAgIGlmIGxlbihsaXN0KSAhPSBuOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignd3JvbmcgYXJyYXkgc2l6ZScpCi0gICAgICAgIGZvciBpdGVtIGluIGxpc3Q6Ci0gICAgICAgICAgICBwYWNrX2l0ZW0oaXRlbSkKLQotICAgIGRlZiBwYWNrX2FycmF5KHNlbGYsIGxpc3QsIHBhY2tfaXRlbSk6Ci0gICAgICAgIG4gPSBsZW4obGlzdCkKLSAgICAgICAgc2VsZi5wYWNrX3VpbnQobikKLSAgICAgICAgc2VsZi5wYWNrX2ZhcnJheShuLCBsaXN0LCBwYWNrX2l0ZW0pCi0KLQotY2xhc3MgVW5wYWNrZXI6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6Ci0gICAgICAgIHNlbGYucmVzZXQoZGF0YSkKLQotICAgIGRlZiByZXNldChzZWxmLCBkYXRhKToKLSAgICAgICAgc2VsZi5idWYgPSBkYXRhCi0gICAgICAgIHNlbGYucG9zID0gMAotCi0gICAgZGVmIGRvbmUoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYucG9zIDwgbGVuKHNlbGYuYnVmKToKLSAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigndW5leHRyYWN0ZWQgZGF0YSByZW1haW5zJykKLQotICAgIGRlZiB1bnBhY2tfdWludChzZWxmKToKLSAgICAgICAgaSA9IHNlbGYucG9zCi0gICAgICAgIHNlbGYucG9zID0gaiA9IGkrNAotICAgICAgICBkYXRhID0gc2VsZi5idWZbaTpqXQotICAgICAgICBpZiBsZW4oZGF0YSkgPCA0OgotICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKLSAgICAgICAgeCA9IGludChvcmQoZGF0YVswXSkpPDwyNCB8IG9yZChkYXRhWzFdKTw8MTYgfCBcCi0gICAgICAgICAgICAgICAgb3JkKGRhdGFbMl0pPDw4IHwgb3JkKGRhdGFbM10pCi0gICAgICAgICMgUmV0dXJuIGEgUHl0aG9uIGxvbmcgb25seSBpZiB0aGUgdmFsdWUgaXMgbm90IHJlcHJlc2VudGFibGUKLSAgICAgICAgIyBhcyBhIG5vbm5lZ2F0aXZlIFB5dGhvbiBpbnQKLSAgICAgICAgaWYgeCA8IDB4ODAwMDAwMDA6IHggPSBpbnQoeCkKLSAgICAgICAgcmV0dXJuIHgKLSAgICBpZiBzdHJ1Y3QgYW5kIHN0cnVjdC51bnBhY2soJ2wnLCAnXDBcMFwwXDEnKSA9PSAxOgotICAgICAgICBkZWYgdW5wYWNrX3VpbnQoc2VsZik6Ci0gICAgICAgICAgICBpID0gc2VsZi5wb3MKLSAgICAgICAgICAgIHNlbGYucG9zID0gaiA9IGkrNAotICAgICAgICAgICAgZGF0YSA9IHNlbGYuYnVmW2k6al0KLSAgICAgICAgICAgIGlmIGxlbihkYXRhKSA8IDQ6Ci0gICAgICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKLSAgICAgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCdsJywgZGF0YSkKLQotICAgIGRlZiB1bnBhY2tfaW50KHNlbGYpOgotICAgICAgICB4ID0gc2VsZi51bnBhY2tfdWludCgpCi0gICAgICAgIGlmIHggPj0gMHg4MDAwMDAwMDogeCA9IHggLSAweDEwMDAwMDAwMAotICAgICAgICByZXR1cm4gaW50KHgpCi0KLSAgICB1bnBhY2tfZW51bSA9IHVucGFja19pbnQKLQotICAgIHVucGFja19ib29sID0gdW5wYWNrX2ludAotCi0gICAgZGVmIHVucGFja191aHlwZXIoc2VsZik6Ci0gICAgICAgIGhpID0gc2VsZi51bnBhY2tfdWludCgpCi0gICAgICAgIGxvID0gc2VsZi51bnBhY2tfdWludCgpCi0gICAgICAgIHJldHVybiBpbnQoaGkpPDwzMiB8IGxvCi0KLSAgICBkZWYgdW5wYWNrX2h5cGVyKHNlbGYpOgotICAgICAgICB4ID0gc2VsZi51bnBhY2tfdWh5cGVyKCkKLSAgICAgICAgaWYgeCA+PSAweDgwMDAwMDAwMDAwMDAwMDA6IHggPSB4IC0gMHgxMDAwMDAwMDAwMDAwMDAwMAotICAgICAgICByZXR1cm4geAotCi0gICAgZGVmIHVucGFja19mbG9hdChzZWxmKToKLSAgICAgICAgIyBYWFgKLSAgICAgICAgaSA9IHNlbGYucG9zCi0gICAgICAgIHNlbGYucG9zID0gaiA9IGkrNAotICAgICAgICBkYXRhID0gc2VsZi5idWZbaTpqXQotICAgICAgICBpZiBsZW4oZGF0YSkgPCA0OgotICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKLSAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soJ2YnLCBkYXRhKVswXQotCi0gICAgZGVmIHVucGFja19kb3VibGUoc2VsZik6Ci0gICAgICAgICMgWFhYCi0gICAgICAgIGkgPSBzZWxmLnBvcwotICAgICAgICBzZWxmLnBvcyA9IGogPSBpKzgKLSAgICAgICAgZGF0YSA9IHNlbGYuYnVmW2k6al0KLSAgICAgICAgaWYgbGVuKGRhdGEpIDwgODoKLSAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCi0gICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCdkJywgZGF0YSlbMF0KLQotICAgIGRlZiB1bnBhY2tfZnN0cmluZyhzZWxmLCBuKToKLSAgICAgICAgaWYgbiA8IDA6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmc3RyaW5nIHNpemUgbXVzdCBiZSBub25uZWdhdGl2ZScpCi0gICAgICAgIGkgPSBzZWxmLnBvcwotICAgICAgICBqID0gaSArIChuKzMpLy80KjQKLSAgICAgICAgaWYgaiA+IGxlbihzZWxmLmJ1Zik6Ci0gICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgotICAgICAgICBzZWxmLnBvcyA9IGoKLSAgICAgICAgcmV0dXJuIHNlbGYuYnVmW2k6aStuXQotCi0gICAgdW5wYWNrX2ZvcGFxdWUgPSB1bnBhY2tfZnN0cmluZwotCi0gICAgZGVmIHVucGFja19zdHJpbmcoc2VsZik6Ci0gICAgICAgIG4gPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgcmV0dXJuIHNlbGYudW5wYWNrX2ZzdHJpbmcobikKLQotICAgIHVucGFja19vcGFxdWUgPSB1bnBhY2tfc3RyaW5nCi0KLSAgICBkZWYgdW5wYWNrX2xpc3Qoc2VsZiwgdW5wYWNrX2l0ZW0pOgotICAgICAgICBsaXN0ID0gW10KLSAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIHggPSBzZWxmLnVucGFja191aW50KCkKLSAgICAgICAgICAgIGlmIHggPT0gMDogYnJlYWsKLSAgICAgICAgICAgIGlmIHggIT0gMToKLSAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJzAgb3IgMSBleHBlY3RlZCwgZ290ICVyJyAlICh4LCApKQotICAgICAgICAgICAgaXRlbSA9IHVucGFja19pdGVtKCkKLSAgICAgICAgICAgIGxpc3QuYXBwZW5kKGl0ZW0pCi0gICAgICAgIHJldHVybiBsaXN0Ci0KLSAgICBkZWYgdW5wYWNrX2ZhcnJheShzZWxmLCBuLCB1bnBhY2tfaXRlbSk6Ci0gICAgICAgIGxpc3QgPSBbXQotICAgICAgICBmb3IgaSBpbiByYW5nZShuKToKLSAgICAgICAgICAgIGxpc3QuYXBwZW5kKHVucGFja19pdGVtKCkpCi0gICAgICAgIHJldHVybiBsaXN0Ci0KLSAgICBkZWYgdW5wYWNrX2FycmF5KHNlbGYsIHVucGFja19pdGVtKToKLSAgICAgICAgbiA9IHNlbGYudW5wYWNrX3VpbnQoKQotICAgICAgICByZXR1cm4gc2VsZi51bnBhY2tfZmFycmF5KG4sIHVucGFja19pdGVtKQpkaWZmIC0tZ2l0IGEvRGVtby9zY3JpcHRzL2VxZml4LnB5IGIvRGVtby9zY3JpcHRzL2VxZml4LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDBjOGRmLi4wMDAwMDAwCi0tLSBhL0RlbW8vc2NyaXB0cy9lcWZpeC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uMwotCi0jIEZpeCBQeXRob24gc291cmNlIGZpbGVzIHRvIHVzZSB0aGUgbmV3IGVxdWFsaXR5IHRlc3Qgb3BlcmF0b3IsIGkuZS4sCi0jICAgICAgIGlmIHggPSB5OiAuLi4KLSMgaXMgY2hhbmdlZCB0bwotIyAgICAgICBpZiB4ID09IHk6IC4uLgotIyBUaGUgc2NyaXB0IGNvcnJlY3RseSB0b2tlbml6ZXMgdGhlIFB5dGhvbiBwcm9ncmFtIHRvIHJlbGlhYmx5Ci0jIGRpc3Rpbmd1aXNoIGJldHdlZW4gYXNzaWdubWVudHMgYW5kIGVxdWFsaXR5IHRlc3RzLgotIwotIyBDb21tYW5kIGxpbmUgYXJndW1lbnRzIGFyZSBmaWxlcyBvciBkaXJlY3RvcmllcyB0byBiZSBwcm9jZXNzZWQuCi0jIERpcmVjdG9yaWVzIGFyZSBzZWFyY2hlZCByZWN1cnNpdmVseSBmb3IgZmlsZXMgd2hvc2UgbmFtZSBsb29rcwotIyBsaWtlIGEgcHl0aG9uIG1vZHVsZS4KLSMgU3ltYm9saWMgbGlua3MgYXJlIGFsd2F5cyBpZ25vcmVkIChleGNlcHQgYXMgZXhwbGljaXQgZGlyZWN0b3J5Ci0jIGFyZ3VtZW50cykuICBPZiBjb3Vyc2UsIHRoZSBvcmlnaW5hbCBmaWxlIGlzIGtlcHQgYXMgYSBiYWNrLXVwCi0jICh3aXRoIGEgIn4iIGF0dGFjaGVkIHRvIGl0cyBuYW1lKS4KLSMgSXQgY29tcGxhaW5zIGFib3V0IGJpbmFyaWVzIChmaWxlcyBjb250YWluaW5nIG51bGwgYnl0ZXMpCi0jIGFuZCBhYm91dCBmaWxlcyB0aGF0IGFyZSBvc3RlbnNpYmx5IG5vdCBQeXRob24gZmlsZXM6IGlmIHRoZSBmaXJzdAotIyBsaW5lIHN0YXJ0cyB3aXRoICcjIScgYW5kIGRvZXMgbm90IGNvbnRhaW4gdGhlIHN0cmluZyAncHl0aG9uJy4KLSMKLSMgQ2hhbmdlcyBtYWRlIGFyZSByZXBvcnRlZCB0byBzdGRvdXQgaW4gYSBkaWZmLWxpa2UgZm9ybWF0LgotIwotIyBVbmRvdWJ0ZWRseSB5b3UgY2FuIGRvIHRoaXMgdXNpbmcgZmluZCBhbmQgc2VkIG9yIHBlcmwsIGJ1dCB0aGlzIGlzCi0jIGEgbmljZSBleGFtcGxlIG9mIFB5dGhvbiBjb2RlIHRoYXQgcmVjdXJzZXMgZG93biBhIGRpcmVjdG9yeSB0cmVlCi0jIGFuZCB1c2VzIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBBbHNvIG5vdGUgc2V2ZXJhbCBzdWJ0bGV0aWVzIGxpa2UKLSMgcHJlc2VydmluZyB0aGUgZmlsZSdzIG1vZGUgYW5kIGF2b2lkaW5nIHRvIGV2ZW4gd3JpdGUgYSB0ZW1wIGZpbGUKLSMgd2hlbiBubyBjaGFuZ2VzIGFyZSBuZWVkZWQgZm9yIGEgZmlsZS4KLSMKLSMgTkI6IGJ5IGNoYW5naW5nIG9ubHkgdGhlIGZ1bmN0aW9uIGZpeGxpbmUoKSB5b3UgY2FuIHR1cm4gdGhpcwotIyBpbnRvIGEgcHJvZ3JhbSBmb3IgYSBkaWZmZXJlbnQgY2hhbmdlIHRvIFB5dGhvbiBwcm9ncmFtcy4uLgotCi1pbXBvcnQgc3lzCi1pbXBvcnQgcmUKLWltcG9ydCBvcwotZnJvbSBzdGF0IGltcG9ydCAqCi1pbXBvcnQgc3RyaW5nCi0KLWVyciA9IHN5cy5zdGRlcnIud3JpdGUKLWRiZyA9IGVycgotcmVwID0gc3lzLnN0ZG91dC53cml0ZQotCi1kZWYgbWFpbigpOgotICAgIGJhZCA9IDAKLSAgICBpZiBub3Qgc3lzLmFyZ3ZbMTpdOiAjIE5vIGFyZ3VtZW50cwotICAgICAgICBlcnIoJ3VzYWdlOiAnICsgc3lzLmFyZ3ZbMF0gKyAnIGZpbGUtb3ItZGlyZWN0b3J5IC4uLlxuJykKLSAgICAgICAgc3lzLmV4aXQoMikKLSAgICBmb3IgYXJnIGluIHN5cy5hcmd2WzE6XToKLSAgICAgICAgaWYgb3MucGF0aC5pc2RpcihhcmcpOgotICAgICAgICAgICAgaWYgcmVjdXJzZWRvd24oYXJnKTogYmFkID0gMQotICAgICAgICBlbGlmIG9zLnBhdGguaXNsaW5rKGFyZyk6Ci0gICAgICAgICAgICBlcnIoYXJnICsgJzogd2lsbCBub3QgcHJvY2VzcyBzeW1ib2xpYyBsaW5rc1xuJykKLSAgICAgICAgICAgIGJhZCA9IDEKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGlmIGZpeChhcmcpOiBiYWQgPSAxCi0gICAgc3lzLmV4aXQoYmFkKQotCi1pc3B5dGhvbnByb2cgPSByZS5jb21waWxlKCdeW2EtekEtWjAtOV9dK1wucHkkJykKLWRlZiBpc3B5dGhvbihuYW1lKToKLSAgICByZXR1cm4gaXNweXRob25wcm9nLm1hdGNoKG5hbWUpID49IDAKLQotZGVmIHJlY3Vyc2Vkb3duKGRpcm5hbWUpOgotICAgIGRiZygncmVjdXJzZWRvd24oJXIpXG4nICUgKGRpcm5hbWUsKSkKLSAgICBiYWQgPSAwCi0gICAgdHJ5OgotICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKLSAgICBleGNlcHQgb3MuZXJyb3IgYXMgbXNnOgotICAgICAgICBlcnIoJyVzOiBjYW5ub3QgbGlzdCBkaXJlY3Rvcnk6ICVyXG4nICUgKGRpcm5hbWUsIG1zZykpCi0gICAgICAgIHJldHVybiAxCi0gICAgbmFtZXMuc29ydCgpCi0gICAgc3ViZGlycyA9IFtdCi0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgIGlmIG5hbWUgaW4gKG9zLmN1cmRpciwgb3MucGFyZGlyKTogY29udGludWUKLSAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkKLSAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoZnVsbG5hbWUpOiBwYXNzCi0gICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSk6Ci0gICAgICAgICAgICBzdWJkaXJzLmFwcGVuZChmdWxsbmFtZSkKLSAgICAgICAgZWxpZiBpc3B5dGhvbihuYW1lKToKLSAgICAgICAgICAgIGlmIGZpeChmdWxsbmFtZSk6IGJhZCA9IDEKLSAgICBmb3IgZnVsbG5hbWUgaW4gc3ViZGlyczoKLSAgICAgICAgaWYgcmVjdXJzZWRvd24oZnVsbG5hbWUpOiBiYWQgPSAxCi0gICAgcmV0dXJuIGJhZAotCi1kZWYgZml4KGZpbGVuYW1lKToKLSMjICAgICAgZGJnKCdmaXgoJXIpXG4nICUgKGRpcm5hbWUsKSkKLSAgICB0cnk6Ci0gICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAncicpCi0gICAgZXhjZXB0IElPRXJyb3IgYXMgbXNnOgotICAgICAgICBlcnIoJyVzOiBjYW5ub3Qgb3BlbjogJXJcbicgJSAoZmlsZW5hbWUsIG1zZykpCi0gICAgICAgIHJldHVybiAxCi0gICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCi0gICAgdGVtcG5hbWUgPSBvcy5wYXRoLmpvaW4oaGVhZCwgJ0AnICsgdGFpbCkKLSAgICBnID0gTm9uZQotICAgICMgSWYgd2UgZmluZCBhIG1hdGNoLCB3ZSByZXdpbmQgdGhlIGZpbGUgYW5kIHN0YXJ0IG92ZXIgYnV0Ci0gICAgIyBub3cgY29weSBldmVyeXRoaW5nIHRvIGEgdGVtcCBmaWxlLgotICAgIGxpbmVubyA9IDAKLSAgICB3aGlsZSAxOgotICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCi0gICAgICAgIGlmIG5vdCBsaW5lOiBicmVhawotICAgICAgICBsaW5lbm8gPSBsaW5lbm8gKyAxCi0gICAgICAgIGlmIGcgaXMgTm9uZSBhbmQgJ1wwJyBpbiBsaW5lOgotICAgICAgICAgICAgIyBDaGVjayBmb3IgYmluYXJ5IGZpbGVzCi0gICAgICAgICAgICBlcnIoZmlsZW5hbWUgKyAnOiBjb250YWlucyBudWxsIGJ5dGVzOyBub3QgZml4ZWRcbicpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHJldHVybiAxCi0gICAgICAgIGlmIGxpbmVubyA9PSAxIGFuZCBnIGlzIE5vbmUgYW5kIGxpbmVbOjJdID09ICcjISc6Ci0gICAgICAgICAgICAjIENoZWNrIGZvciBub24tUHl0aG9uIHNjcmlwdHMKLSAgICAgICAgICAgIHdvcmRzID0gc3RyaW5nLnNwbGl0KGxpbmVbMjpdKQotICAgICAgICAgICAgaWYgd29yZHMgYW5kIHJlLnNlYXJjaCgnW3BQXXl0aG9uJywgd29yZHNbMF0pIDwgMDoKLSAgICAgICAgICAgICAgICBtc2cgPSBmaWxlbmFtZSArICc6ICcgKyB3b3Jkc1swXQotICAgICAgICAgICAgICAgIG1zZyA9IG1zZyArICcgc2NyaXB0OyBub3QgZml4ZWRcbicKLSAgICAgICAgICAgICAgICBlcnIobXNnKQotICAgICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgICAgIHJldHVybiAxCi0gICAgICAgIHdoaWxlIGxpbmVbLTI6XSA9PSAnXFxcbic6Ci0gICAgICAgICAgICBuZXh0bGluZSA9IGYucmVhZGxpbmUoKQotICAgICAgICAgICAgaWYgbm90IG5leHRsaW5lOiBicmVhawotICAgICAgICAgICAgbGluZSA9IGxpbmUgKyBuZXh0bGluZQotICAgICAgICAgICAgbGluZW5vID0gbGluZW5vICsgMQotICAgICAgICBuZXdsaW5lID0gZml4bGluZShsaW5lKQotICAgICAgICBpZiBuZXdsaW5lICE9IGxpbmU6Ci0gICAgICAgICAgICBpZiBnIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBnID0gb3Blbih0ZW1wbmFtZSwgJ3cnKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIG1zZzoKLSAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgICAgIGVycignJXM6IGNhbm5vdCBjcmVhdGU6ICVyXG4nICUgKHRlbXBuYW1lLCBtc2cpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQotICAgICAgICAgICAgICAgIGYuc2VlaygwKQotICAgICAgICAgICAgICAgIGxpbmVubyA9IDAKLSAgICAgICAgICAgICAgICByZXAoZmlsZW5hbWUgKyAnOlxuJykKLSAgICAgICAgICAgICAgICBjb250aW51ZSAjIHJlc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICByZXAocmVwcihsaW5lbm8pICsgJ1xuJykKLSAgICAgICAgICAgIHJlcCgnPCAnICsgbGluZSkKLSAgICAgICAgICAgIHJlcCgnPiAnICsgbmV3bGluZSkKLSAgICAgICAgaWYgZyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGcud3JpdGUobmV3bGluZSkKLQotICAgICMgRW5kIG9mIGZpbGUKLSAgICBmLmNsb3NlKCkKLSAgICBpZiBub3QgZzogcmV0dXJuIDAgIyBObyBjaGFuZ2VzCi0KLSAgICAjIEZpbmlzaGluZyB0b3VjaCAtLSBtb3ZlIGZpbGVzCi0KLSAgICAjIEZpcnN0IGNvcHkgdGhlIGZpbGUncyBtb2RlIHRvIHRoZSB0ZW1wIGZpbGUKLSAgICB0cnk6Ci0gICAgICAgIHN0YXRidWYgPSBvcy5zdGF0KGZpbGVuYW1lKQotICAgICAgICBvcy5jaG1vZCh0ZW1wbmFtZSwgc3RhdGJ1ZltTVF9NT0RFXSAmIDBvNzc3NykKLSAgICBleGNlcHQgb3MuZXJyb3IgYXMgbXNnOgotICAgICAgICBlcnIoJyVzOiB3YXJuaW5nOiBjaG1vZCBmYWlsZWQgKCVyKVxuJyAlICh0ZW1wbmFtZSwgbXNnKSkKLSAgICAjIFRoZW4gbWFrZSBhIGJhY2t1cCBvZiB0aGUgb3JpZ2luYWwgZmlsZSBhcyBmaWxlbmFtZX4KLSAgICB0cnk6Ci0gICAgICAgIG9zLnJlbmFtZShmaWxlbmFtZSwgZmlsZW5hbWUgKyAnficpCi0gICAgZXhjZXB0IG9zLmVycm9yIGFzIG1zZzoKLSAgICAgICAgZXJyKCclczogd2FybmluZzogYmFja3VwIGZhaWxlZCAoJXIpXG4nICUgKGZpbGVuYW1lLCBtc2cpKQotICAgICMgTm93IG1vdmUgdGhlIHRlbXAgZmlsZSB0byB0aGUgb3JpZ2luYWwgZmlsZQotICAgIHRyeToKLSAgICAgICAgb3MucmVuYW1lKHRlbXBuYW1lLCBmaWxlbmFtZSkKLSAgICBleGNlcHQgb3MuZXJyb3IgYXMgbXNnOgotICAgICAgICBlcnIoJyVzOiByZW5hbWUgZmFpbGVkICglcilcbicgJSAoZmlsZW5hbWUsIG1zZykpCi0gICAgICAgIHJldHVybiAxCi0gICAgIyBSZXR1cm4gc3VjY2VzCi0gICAgcmV0dXJuIDAKLQotCi1mcm9tIHRva2VuaXplIGltcG9ydCB0b2tlbnByb2cKLQotbWF0Y2ggPSB7J2lmJzonOicsICdlbGlmJzonOicsICd3aGlsZSc6JzonLCAncmV0dXJuJzonXG4nLCBcCi0gICAgICAgICAnKCc6JyknLCAnWyc6J10nLCAneyc6J30nLCAnYCc6J2AnfQotCi1kZWYgZml4bGluZShsaW5lKToKLSAgICAjIFF1aWNrIGNoZWNrIGZvciBlYXN5IGNhc2UKLSAgICBpZiAnPScgbm90IGluIGxpbmU6IHJldHVybiBsaW5lCi0KLSAgICBpLCBuID0gMCwgbGVuKGxpbmUpCi0gICAgc3RhY2sgPSBbXQotICAgIHdoaWxlIGkgPCBuOgotICAgICAgICBqID0gdG9rZW5wcm9nLm1hdGNoKGxpbmUsIGkpCi0gICAgICAgIGlmIGogPCAwOgotICAgICAgICAgICAgIyBBIGJhZCB0b2tlbjsgZm9yZ2V0IGFib3V0IHRoZSByZXN0IG9mIHRoaXMgbGluZQotICAgICAgICAgICAgcHJpbnQoJyhTeW50YXggZXJyb3I6KScpCi0gICAgICAgICAgICBwcmludChsaW5lLCBlbmQ9JyAnKQotICAgICAgICAgICAgcmV0dXJuIGxpbmUKLSAgICAgICAgYSwgYiA9IHRva2VucHJvZy5yZWdzWzNdICMgTG9jYXRpb24gb2YgdGhlIHRva2VuIHByb3BlcgotICAgICAgICB0b2tlbiA9IGxpbmVbYTpiXQotICAgICAgICBpID0gaStqCi0gICAgICAgIGlmIHN0YWNrIGFuZCB0b2tlbiA9PSBzdGFja1stMV06Ci0gICAgICAgICAgICBkZWwgc3RhY2tbLTFdCi0gICAgICAgIGVsaWYgdG9rZW4gaW4gbWF0Y2g6Ci0gICAgICAgICAgICBzdGFjay5hcHBlbmQobWF0Y2hbdG9rZW5dKQotICAgICAgICBlbGlmIHRva2VuID09ICc9JyBhbmQgc3RhY2s6Ci0gICAgICAgICAgICBsaW5lID0gbGluZVs6YV0gKyAnPT0nICsgbGluZVtiOl0KLSAgICAgICAgICAgIGksIG4gPSBhICsgbGVuKCc9PScpLCBsZW4obGluZSkKLSAgICAgICAgZWxpZiB0b2tlbiA9PSAnPT0nIGFuZCBub3Qgc3RhY2s6Ci0gICAgICAgICAgICBwcmludCgnKFdhcm5pbmc6IFwnPT1cJyBhdCB0b3AgbGV2ZWw6KScpCi0gICAgICAgICAgICBwcmludChsaW5lLCBlbmQ9JyAnKQotICAgIHJldHVybiBsaW5lCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9EZW1vL3NjcmlwdHMvZnJvbS5weSBiL0RlbW8vc2NyaXB0cy9mcm9tLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGE5MzQ2Li4wMDAwMDAwCi0tLSBhL0RlbW8vc2NyaXB0cy9mcm9tLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbjMKLQotIyBQcmludCBGcm9tIGFuZCBTdWJqZWN0IG9mIG1lc3NhZ2VzIGluICRNQUlMLgotIyBFeHRlbnNpb24gdG8gbXVsdGlwbGUgbWFpbGJveGVzIGFuZCBvdGhlciBiZWxscyAmIHdoaXN0bGVzIGFyZSBsZWZ0Ci0jIGFzIGV4ZXJjaXNlcyBmb3IgdGhlIHJlYWRlci4KLQotaW1wb3J0IHN5cywgb3MKLQotIyBPcGVuIG1haWxib3ggZmlsZS4gIEV4aXRzIHdpdGggZXhjZXB0aW9uIHdoZW4gdGhpcyBmYWlscy4KLQotdHJ5OgotICAgIG1haWxib3ggPSBvcy5lbnZpcm9uWydNQUlMJ10KLWV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIEtleUVycm9yKToKLSAgICBzeXMuc3RkZXJyLndyaXRlKCdObyBlbnZpcm9ubWVudCB2YXJpYWJsZSAkTUFJTFxuJykKLSAgICBzeXMuZXhpdCgyKQotCi10cnk6Ci0gICAgbWFpbCA9IG9wZW4obWFpbGJveCkKLWV4Y2VwdCBJT0Vycm9yOgotICAgIHN5cy5leGl0KCdDYW5ub3Qgb3BlbiBtYWlsYm94IGZpbGU6ICcgKyBtYWlsYm94KQotCi13aGlsZSAxOgotICAgIGxpbmUgPSBtYWlsLnJlYWRsaW5lKCkKLSAgICBpZiBub3QgbGluZToKLSAgICAgICAgYnJlYWsgIyBFT0YKLSAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ0Zyb20gJyk6Ci0gICAgICAgICMgU3RhcnQgb2YgbWVzc2FnZSBmb3VuZAotICAgICAgICBwcmludChsaW5lWzotMV0sIGVuZD0nICcpCi0gICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICBsaW5lID0gbWFpbC5yZWFkbGluZSgpCi0gICAgICAgICAgICBpZiBub3QgbGluZSBvciBsaW5lID09ICdcbic6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnU3ViamVjdDogJyk6Ci0gICAgICAgICAgICAgICAgcHJpbnQocmVwcihsaW5lWzk6LTFdKSwgZW5kPScgJykKLSAgICAgICAgcHJpbnQoKQpkaWZmIC0tZ2l0IGEvRGVtby9zY3JpcHRzL2xwd2F0Y2gucHkgYi9EZW1vL3NjcmlwdHMvbHB3YXRjaC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDFkOWZlYS4uMDAwMDAwMAotLS0gYS9EZW1vL3NjcmlwdHMvbHB3YXRjaC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uMwotCi0jIFdhdGNoIGxpbmUgcHJpbnRlciBxdWV1ZShzKS4KLSMgSW50ZW5kZWQgZm9yIEJTRCA0LjMgbHBxLgotCi1pbXBvcnQgb3MKLWltcG9ydCBzeXMKLWltcG9ydCB0aW1lCi0KLURFRl9QUklOVEVSID0gJ3BzYycKLURFRl9ERUxBWSA9IDEwCi0KLWRlZiBtYWluKCk6Ci0gICAgZGVsYXkgPSBERUZfREVMQVkgIyBYWFggVXNlIGdldG9wdCgpIGxhdGVyCi0gICAgdHJ5OgotICAgICAgICB0aGlzdXNlciA9IG9zLmVudmlyb25bJ0xPR05BTUUnXQotICAgIGV4Y2VwdDoKLSAgICAgICAgdGhpc3VzZXIgPSBvcy5lbnZpcm9uWydVU0VSJ10KLSAgICBwcmludGVycyA9IHN5cy5hcmd2WzE6XQotICAgIGlmIHByaW50ZXJzOgotICAgICAgICAjIFN0cmlwICctUCcgZnJvbSBwcmludGVyIG5hbWVzIGp1c3QgaW4gY2FzZQotICAgICAgICAjIHRoZSB1c2VyIHNwZWNpZmllZCBpdC4uLgotICAgICAgICBmb3IgaSwgbmFtZSBpbiBlbnVtZXJhdGUocHJpbnRlcnMpOgotICAgICAgICAgICAgaWYgbmFtZVs6Ml0gPT0gJy1QJzoKLSAgICAgICAgICAgICAgICBwcmludGVyc1tpXSA9IG5hbWVbMjpdCi0gICAgZWxzZToKLSAgICAgICAgaWYgJ1BSSU5URVInIGluIG9zLmVudmlyb246Ci0gICAgICAgICAgICBwcmludGVycyA9IFtvcy5lbnZpcm9uWydQUklOVEVSJ11dCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludGVycyA9IFtERUZfUFJJTlRFUl0KLQotICAgIGNsZWFyaG9tZSA9IG9zLnBvcGVuKCdjbGVhcicsICdyJykucmVhZCgpCi0KLSAgICB3aGlsZSBUcnVlOgotICAgICAgICB0ZXh0ID0gY2xlYXJob21lCi0gICAgICAgIGZvciBuYW1lIGluIHByaW50ZXJzOgotICAgICAgICAgICAgdGV4dCArPSBtYWtlc3RhdHVzKG5hbWUsIHRoaXN1c2VyKSArICdcbicKLSAgICAgICAgcHJpbnQodGV4dCkKLSAgICAgICAgdGltZS5zbGVlcChkZWxheSkKLQotZGVmIG1ha2VzdGF0dXMobmFtZSwgdGhpc3VzZXIpOgotICAgIHBpcGUgPSBvcy5wb3BlbignbHBxIC1QJyArIG5hbWUgKyAnIDI+JjEnLCAncicpCi0gICAgbGluZXMgPSBbXQotICAgIHVzZXJzID0ge30KLSAgICBhaGVhZGJ5dGVzID0gMAotICAgIGFoZWFkam9icyA9IDAKLSAgICB1c2Vyc2VlbiA9IEZhbHNlCi0gICAgdG90YWxieXRlcyA9IDAKLSAgICB0b3RhbGpvYnMgPSAwCi0gICAgZm9yIGxpbmUgaW4gcGlwZToKLSAgICAgICAgZmllbGRzID0gbGluZS5zcGxpdCgpCi0gICAgICAgIG4gPSBsZW4oZmllbGRzKQotICAgICAgICBpZiBsZW4oZmllbGRzKSA+PSA2IGFuZCBmaWVsZHNbbi0xXSA9PSAnYnl0ZXMnOgotICAgICAgICAgICAgcmFuaywgdXNlciwgam9iID0gZmllbGRzWzA6M10KLSAgICAgICAgICAgIGZpbGVzID0gZmllbGRzWzM6LTJdCi0gICAgICAgICAgICBieXRlcyA9IGludChmaWVsZHNbbi0yXSkKLSAgICAgICAgICAgIGlmIHVzZXIgPT0gdGhpc3VzZXI6Ci0gICAgICAgICAgICAgICAgdXNlcnNlZW4gPSBUcnVlCi0gICAgICAgICAgICBlbGlmIG5vdCB1c2Vyc2VlbjoKLSAgICAgICAgICAgICAgICBhaGVhZGJ5dGVzICs9IGJ5dGVzCi0gICAgICAgICAgICAgICAgYWhlYWRqb2JzICs9IDEKLSAgICAgICAgICAgIHRvdGFsYnl0ZXMgKz0gYnl0ZXMKLSAgICAgICAgICAgIHRvdGFsam9icyArPSAxCi0gICAgICAgICAgICB1am9icywgdWJ5dGVzID0gdXNlcnMuZ2V0KHVzZXIsICgwLCAwKSkKLSAgICAgICAgICAgIHVqb2JzICs9IDEKLSAgICAgICAgICAgIHVieXRlcyArPSBieXRlcwotICAgICAgICAgICAgdXNlcnNbdXNlcl0gPSB1am9icywgdWJ5dGVzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpZiBmaWVsZHMgYW5kIGZpZWxkc1swXSAhPSAnUmFuayc6Ci0gICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQotICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gJ25vIGVudHJpZXMnOgotICAgICAgICAgICAgICAgICAgICBsaW5lID0gbmFtZSArICc6IGlkbGUnCi0gICAgICAgICAgICAgICAgZWxpZiBsaW5lWy0yMjpdID09ICcgaXMgcmVhZHkgYW5kIHByaW50aW5nJzoKLSAgICAgICAgICAgICAgICAgICAgbGluZSA9IG5hbWUKLSAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZSkKLQotICAgIGlmIHRvdGFsam9iczoKLSAgICAgICAgbGluZSA9ICclZCBLJyAlICgodG90YWxieXRlcysxMDIzKSAvLyAxMDI0KQotICAgICAgICBpZiB0b3RhbGpvYnMgIT0gbGVuKHVzZXJzKToKLSAgICAgICAgICAgIGxpbmUgKz0gJyAoJWQgam9icyknICUgdG90YWxqb2JzCi0gICAgICAgIGlmIGxlbih1c2VycykgPT0gMToKLSAgICAgICAgICAgIGxpbmUgKz0gJyBmb3IgJXMnICUgbmV4dChpdGVyKHVzZXJzKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGxpbmUgKz0gJyBmb3IgJWQgdXNlcnMnICUgbGVuKHVzZXJzKQotICAgICAgICAgICAgaWYgdXNlcnNlZW46Ci0gICAgICAgICAgICAgICAgaWYgYWhlYWRqb2JzID09IDA6Ci0gICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gJyAoJXMgZmlyc3QpJyAlIHRoaXN1c2VyCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgbGluZSArPSAnICglZCBLIGJlZm9yZSAlcyknICUgKAotICAgICAgICAgICAgICAgICAgICAgICAgKGFoZWFkYnl0ZXMrMTAyMykgLy8gMTAyNCwgdGhpc3VzZXIpCi0gICAgICAgIGxpbmVzLmFwcGVuZChsaW5lKQotCi0gICAgc3RzID0gcGlwZS5jbG9zZSgpCi0gICAgaWYgc3RzOgotICAgICAgICBsaW5lcy5hcHBlbmQoJ2xwcSBleGl0IHN0YXR1cyAlcicgJSAoc3RzLCkpCi0gICAgcmV0dXJuICc6ICcuam9pbihsaW5lcykKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICB0cnk6Ci0gICAgICAgIG1haW4oKQotICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvRGVtby9zY3JpcHRzL21ha2VkaXIucHkgYi9EZW1vL3NjcmlwdHMvbWFrZWRpci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYTE0ZTg0OC4uMDAwMDAwMAotLS0gYS9EZW1vL3NjcmlwdHMvbWFrZWRpci5weQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24zCi0KLSMgTGlrZSBta2RpciwgYnV0IGFsc28gbWFrZSBpbnRlcm1lZGlhdGUgZGlyZWN0b3JpZXMgaWYgbmVjZXNzYXJ5LgotIyBJdCBpcyBub3QgYW4gZXJyb3IgaWYgdGhlIGdpdmVuIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyAoYXMgbG9uZwotIyBhcyBpdCBpcyBhIGRpcmVjdG9yeSkuCi0jIEVycm9ycyBhcmUgbm90IHRyZWF0ZWQgc3BlY2lhbGx5IC0tIHlvdSBqdXN0IGdldCBhIFB5dGhvbiBleGNlcHRpb24uCi0KLWltcG9ydCBzeXMsIG9zCi0KLWRlZiBtYWluKCk6Ci0gICAgZm9yIHAgaW4gc3lzLmFyZ3ZbMTpdOgotICAgICAgICBtYWtlZGlycyhwKQotCi1kZWYgbWFrZWRpcnMocCk6Ci0gICAgaWYgcCBhbmQgbm90IG9zLnBhdGguaXNkaXIocCk6Ci0gICAgICAgIGhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0KHApCi0gICAgICAgIG1ha2VkaXJzKGhlYWQpCi0gICAgICAgIG9zLm1rZGlyKHAsIDBvNzc3KQotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvRGVtby9zY3JpcHRzL21ib3hjb252ZXJ0LnB5IGIvRGVtby9zY3JpcHRzL21ib3hjb252ZXJ0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYjNlZDg5Li4wMDAwMDAwCi0tLSBhL0RlbW8vc2NyaXB0cy9tYm94Y29udmVydC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uMwotCi0jIENvbnZlcnQgIE1IIGRpcmVjdG9yaWVzICgxIG1lc3NhZ2UgcGVyIGZpbGUpIG9yIE1NREYgbWFpbGJveGVzICg0eF5BCi0jIGRlbGltaXRlZCkgdG8gdW5peCBtYWlsYm94IChGcm9tIC4uLiBkZWxpbWl0ZWQpIG9uIHN0ZG91dC4KLSMgSWYgLWYgaXMgZ2l2ZW4sIGZpbGVzIGNvbnRhaW4gb25lIG1lc3NhZ2UgcGVyIGZpbGUgKGUuZy4gTUggbWVzc2FnZXMpCi0KLWltcG9ydCByZmM4MjIKLWltcG9ydCBzeXMKLWltcG9ydCB0aW1lCi1pbXBvcnQgb3MKLWltcG9ydCBzdGF0Ci1pbXBvcnQgZ2V0b3B0Ci1pbXBvcnQgcmUKLQotZGVmIG1haW4oKToKLSAgICBkb2ZpbGUgPSBtbWRmCi0gICAgdHJ5OgotICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdmJykKLSAgICBleGNlcHQgZ2V0b3B0LmVycm9yIGFzIG1zZzoKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnJXNcbicgJSBtc2cpCi0gICAgICAgIHN5cy5leGl0KDIpCi0gICAgZm9yIG8sIGEgaW4gb3B0czoKLSAgICAgICAgaWYgbyA9PSAnLWYnOgotICAgICAgICAgICAgZG9maWxlID0gbWVzc2FnZQotICAgIGlmIG5vdCBhcmdzOgotICAgICAgICBhcmdzID0gWyctJ10KLSAgICBzdHMgPSAwCi0gICAgZm9yIGFyZyBpbiBhcmdzOgotICAgICAgICBpZiBhcmcgPT0gJy0nIG9yIGFyZyA9PSAnJzoKLSAgICAgICAgICAgIHN0cyA9IGRvZmlsZShzeXMuc3RkaW4pIG9yIHN0cwotICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoYXJnKToKLSAgICAgICAgICAgIHN0cyA9IG1oKGFyZykgb3Igc3RzCi0gICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUoYXJnKToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBmID0gb3BlbihhcmcpCi0gICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBtc2c6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnJXM6ICVzXG4nICUgKGFyZywgbXNnKSkKLSAgICAgICAgICAgICAgICBzdHMgPSAxCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIHN0cyA9IGRvZmlsZShmKSBvciBzdHMKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnJXM6IG5vdCBmb3VuZFxuJyAlIGFyZykKLSAgICAgICAgICAgIHN0cyA9IDEKLSAgICBpZiBzdHM6Ci0gICAgICAgIHN5cy5leGl0KHN0cykKLQotbnVtZXJpYyA9IHJlLmNvbXBpbGUoJ1sxLTldWzAtOV0qJykKLQotZGVmIG1oKGRpcik6Ci0gICAgc3RzID0gMAotICAgIG1zZ3MgPSBvcy5saXN0ZGlyKGRpcikKLSAgICBmb3IgbXNnIGluIG1zZ3M6Ci0gICAgICAgIGlmIG51bWVyaWMubWF0Y2gobXNnKSAhPSBsZW4obXNnKToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZuID0gb3MucGF0aC5qb2luKGRpciwgbXNnKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmID0gb3BlbihmbikKLSAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgbXNnOgotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnJXM6ICVzXG4nICUgKGZuLCBtc2cpKQotICAgICAgICAgICAgc3RzID0gMQotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgc3RzID0gbWVzc2FnZShmKSBvciBzdHMKLSAgICByZXR1cm4gc3RzCi0KLWRlZiBtbWRmKGYpOgotICAgIHN0cyA9IDAKLSAgICB3aGlsZSAxOgotICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCi0gICAgICAgIGlmIG5vdCBsaW5lOgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgaWYgbGluZSA9PSAnXDFcMVwxXDFcbic6Ci0gICAgICAgICAgICBzdHMgPSBtZXNzYWdlKGYsIGxpbmUpIG9yIHN0cwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgKLSAgICAgICAgICAgICAgICAgICAgJ0JhZCBsaW5lIGluIE1NRkQgbWFpbGJveDogJXJcbicgJSAobGluZSwpKQotICAgIHJldHVybiBzdHMKLQotY291bnRlciA9IDAgIyBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgTWVzc2FnZS1JRCBoZWFkZXJzCi0KLWRlZiBtZXNzYWdlKGYsIGRlbGltaXRlciA9ICcnKToKLSAgICBzdHMgPSAwCi0gICAgIyBQYXJzZSBSRkM4MjIgaGVhZGVyCi0gICAgbSA9IHJmYzgyMi5NZXNzYWdlKGYpCi0gICAgIyBXcml0ZSB1bml4IGhlYWRlciBsaW5lCi0gICAgZnVsbG5hbWUsIGVtYWlsID0gbS5nZXRhZGRyKCdGcm9tJykKLSAgICB0dCA9IG0uZ2V0ZGF0ZSgnRGF0ZScpCi0gICAgaWYgdHQ6Ci0gICAgICAgIHQgPSB0aW1lLm1rdGltZSh0dCkKLSAgICBlbHNlOgotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKAotICAgICAgICAgICAgICAgICdVbnBhcnNlYWJsZSBkYXRlOiAlclxuJyAlIChtLmdldCgnRGF0ZScpLCkpCi0gICAgICAgIHQgPSBvcy5mc3RhdChmLmZpbGVubygpKVtzdGF0LlNUX01USU1FXQotICAgIHByaW50KCdGcm9tJywgZW1haWwsIHRpbWUuY3RpbWUodCkpCi0gICAgIyBDb3B5IFJGQzgyMiBoZWFkZXIKLSAgICBmb3IgbGluZSBpbiBtLmhlYWRlcnM6Ci0gICAgICAgIHByaW50KGxpbmUsIGVuZD0nICcpCi0gICAgIyBJbnZlbnQgTWVzc2FnZS1JRCBoZWFkZXIgaWYgbm9uZSBpcyBwcmVzZW50Ci0gICAgaWYgJ21lc3NhZ2UtaWQnIG5vdCBpbiBtOgotICAgICAgICBnbG9iYWwgY291bnRlcgotICAgICAgICBjb3VudGVyID0gY291bnRlciArIDEKLSAgICAgICAgbXNnaWQgPSAiPCVzLiVkPiIgJSAoaGV4KHQpLCBjb3VudGVyKQotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJBZGRpbmcgTWVzc2FnZS1JRCAlcyAoRnJvbSAlcylcbiIgJQotICAgICAgICAgICAgICAgICAgICAgICAgIChtc2dpZCwgZW1haWwpKQotICAgICAgICBwcmludCgiTWVzc2FnZS1JRDoiLCBtc2dpZCkKLSAgICBwcmludCgpCi0gICAgIyBDb3B5IGJvZHkKLSAgICB3aGlsZSAxOgotICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCi0gICAgICAgIGlmIGxpbmUgPT0gZGVsaW1pdGVyOgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgaWYgbm90IGxpbmU6Ci0gICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdVbmV4cGVjdGVkIEVPRiBpbiBtZXNzYWdlXG4nKQotICAgICAgICAgICAgc3RzID0gMQotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgaWYgbGluZVs6NV0gPT0gJ0Zyb20gJzoKLSAgICAgICAgICAgIGxpbmUgPSAnPicgKyBsaW5lCi0gICAgICAgIHByaW50KGxpbmUsIGVuZD0nICcpCi0gICAgIyBQcmludCB0cmFpbGluZyBuZXdsaW5lCi0gICAgcHJpbnQoKQotICAgIHJldHVybiBzdHMKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0RlbW8vc2NyaXB0cy9tb3JzZS5weSBiL0RlbW8vc2NyaXB0cy9tb3JzZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzJmNDA4Zi4uMDAwMDAwMAotLS0gYS9EZW1vL3NjcmlwdHMvbW9yc2UucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbjMKLQotIyBEQUggc2hvdWxkIGJlIHRocmVlIERPVHMuCi0jIFNwYWNlIGJldHdlZW4gRE9UcyBhbmQgREFIcyBzaG91bGQgYmUgb25lIERPVC4KLSMgU3BhY2UgYmV0d2VlbiB0d28gbGV0dGVycyBzaG91bGQgYmUgb25lIERBSC4KLSMgU3BhY2UgYmV0d2VlbiB0d28gd29yZHMgc2hvdWxkIGJlIERPVCBEQUggREFILgotCi1pbXBvcnQgc3lzLCBtYXRoLCBhaWZjCi1mcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNsb3NpbmcKLQotRE9UID0gMzAKLURBSCA9IDMgKiBET1QKLU9DVEFWRSA9IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDEgPT0gNDQxIEh6LCAyID09IDg4MiBIeiwgLi4uCi0KLW1vcnNldGFiID0gewotICAgICAgICAnQSc6ICcuLScsICAgICAgICAgICAgICAnYSc6ICcuLScsCi0gICAgICAgICdCJzogJy0uLi4nLCAgICAgICAgICAgICdiJzogJy0uLi4nLAotICAgICAgICAnQyc6ICctLi0uJywgICAgICAgICAgICAnYyc6ICctLi0uJywKLSAgICAgICAgJ0QnOiAnLS4uJywgICAgICAgICAgICAgJ2QnOiAnLS4uJywKLSAgICAgICAgJ0UnOiAnLicsICAgICAgICAgICAgICAgJ2UnOiAnLicsCi0gICAgICAgICdGJzogJy4uLS4nLCAgICAgICAgICAgICdmJzogJy4uLS4nLAotICAgICAgICAnRyc6ICctLS4nLCAgICAgICAgICAgICAnZyc6ICctLS4nLAotICAgICAgICAnSCc6ICcuLi4uJywgICAgICAgICAgICAnaCc6ICcuLi4uJywKLSAgICAgICAgJ0knOiAnLi4nLCAgICAgICAgICAgICAgJ2knOiAnLi4nLAotICAgICAgICAnSic6ICcuLS0tJywgICAgICAgICAgICAnaic6ICcuLS0tJywKLSAgICAgICAgJ0snOiAnLS4tJywgICAgICAgICAgICAgJ2snOiAnLS4tJywKLSAgICAgICAgJ0wnOiAnLi0uLicsICAgICAgICAgICAgJ2wnOiAnLi0uLicsCi0gICAgICAgICdNJzogJy0tJywgICAgICAgICAgICAgICdtJzogJy0tJywKLSAgICAgICAgJ04nOiAnLS4nLCAgICAgICAgICAgICAgJ24nOiAnLS4nLAotICAgICAgICAnTyc6ICctLS0nLCAgICAgICAgICAgICAnbyc6ICctLS0nLAotICAgICAgICAnUCc6ICcuLS0uJywgICAgICAgICAgICAncCc6ICcuLS0uJywKLSAgICAgICAgJ1EnOiAnLS0uLScsICAgICAgICAgICAgJ3EnOiAnLS0uLScsCi0gICAgICAgICdSJzogJy4tLicsICAgICAgICAgICAgICdyJzogJy4tLicsCi0gICAgICAgICdTJzogJy4uLicsICAgICAgICAgICAgICdzJzogJy4uLicsCi0gICAgICAgICdUJzogJy0nLCAgICAgICAgICAgICAgICd0JzogJy0nLAotICAgICAgICAnVSc6ICcuLi0nLCAgICAgICAgICAgICAndSc6ICcuLi0nLAotICAgICAgICAnVic6ICcuLi4tJywgICAgICAgICAgICAndic6ICcuLi4tJywKLSAgICAgICAgJ1cnOiAnLi0tJywgICAgICAgICAgICAgJ3cnOiAnLi0tJywKLSAgICAgICAgJ1gnOiAnLS4uLScsICAgICAgICAgICAgJ3gnOiAnLS4uLScsCi0gICAgICAgICdZJzogJy0uLS0nLCAgICAgICAgICAgICd5JzogJy0uLS0nLAotICAgICAgICAnWic6ICctLS4uJywgICAgICAgICAgICAneic6ICctLS4uJywKLSAgICAgICAgJzAnOiAnLS0tLS0nLCAgICAgICAgICAgJywnOiAnLS0uLi0tJywKLSAgICAgICAgJzEnOiAnLi0tLS0nLCAgICAgICAgICAgJy4nOiAnLi0uLS4tJywKLSAgICAgICAgJzInOiAnLi4tLS0nLCAgICAgICAgICAgJz8nOiAnLi4tLS4uJywKLSAgICAgICAgJzMnOiAnLi4uLS0nLCAgICAgICAgICAgJzsnOiAnLS4tLi0uJywKLSAgICAgICAgJzQnOiAnLi4uLi0nLCAgICAgICAgICAgJzonOiAnLS0tLi4uJywKLSAgICAgICAgJzUnOiAnLi4uLi4nLCAgICAgICAgICAgIiciOiAnLi0tLS0uJywKLSAgICAgICAgJzYnOiAnLS4uLi4nLCAgICAgICAgICAgJy0nOiAnLS4uLi4tJywKLSAgICAgICAgJzcnOiAnLS0uLi4nLCAgICAgICAgICAgJy8nOiAnLS4uLS4nLAotICAgICAgICAnOCc6ICctLS0uLicsICAgICAgICAgICAnKCc6ICctLi0tLi0nLAotICAgICAgICAnOSc6ICctLS0tLicsICAgICAgICAgICAnKSc6ICctLi0tLi0nLAotICAgICAgICAnICc6ICcgJywgICAgICAgICAgICAgICAnXyc6ICcuLi0tLi0nLAotfQotCi1ub3dhdmUgPSBiJ1wwJyAqIDIwMAotCi0jIElmIHdlIHBsYXkgYXQgNDQuMSBrSHogKHdoaWNoIHdlIGRvKSwgdGhlbiBpZiB3ZSBwcm9kdWNlIG9uZSBzaW5lCi0jIHdhdmUgaW4gMTAwIHNhbXBsZXMsIHdlIGdldCBhIHRvbmUgb2YgNDQxIEh6LiAgSWYgd2UgcHJvZHVjZSB0d28KLSMgc2luZSB3YXZlcyBpbiB0aGVzZSAxMDAgc2FtcGxlcywgd2UgZ2V0IGEgdG9uZSBvZiA4ODIgSHouICA4ODIgSHoKLSMgYXBwZWFycyB0byBiZSBhIG5pY2Ugb25lIGZvciBwbGF5aW5nIG1vcnNlIGNvZGUuCi1kZWYgbWt3YXZlKG9jdGF2ZSk6Ci0gICAgc2luZXdhdmUgPSBieXRlYXJyYXkoKQotICAgIGZvciBpIGluIHJhbmdlKDEwMCk6Ci0gICAgICAgIHZhbCA9IGludChtYXRoLnNpbihtYXRoLnBpICogaSAqIG9jdGF2ZSAvIDUwLjApICogMzAwMDApCi0gICAgICAgIHNpbmV3YXZlLmV4dGVuZChbKHZhbCA+PiA4KSAmIDI1NSwgdmFsICYgMjU1XSkKLSAgICByZXR1cm4gYnl0ZXMoc2luZXdhdmUpCi0KLWRlZmF1bHR3YXZlID0gbWt3YXZlKE9DVEFWRSkKLQotZGVmIG1haW4oKToKLSAgICBpbXBvcnQgZ2V0b3B0Ci0gICAgdHJ5OgotICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdvOnA6JykKLSAgICBleGNlcHQgZ2V0b3B0LmVycm9yOgotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdVc2FnZSAnICsgc3lzLmFyZ3ZbMF0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICcgWyAtbyBvdXRmaWxlIF0gWyAtcCBvY3RhdmUgXSBbIHdvcmRzIF0gLi4uXG4nKQotICAgICAgICBzeXMuZXhpdCgxKQotICAgIHdhdmUgPSBkZWZhdWx0d2F2ZQotICAgIG91dGZpbGUgPSAnbW9yc2UuYWlmYycKLSAgICBmb3IgbywgYSBpbiBvcHRzOgotICAgICAgICBpZiBvID09ICctbyc6Ci0gICAgICAgICAgICBvdXRmaWxlID0gYQotICAgICAgICBpZiBvID09ICctcCc6Ci0gICAgICAgICAgICB3YXZlID0gbWt3YXZlKGludChhKSkKLSAgICB3aXRoIGNsb3NpbmcoYWlmYy5vcGVuKG91dGZpbGUsICd3JykpIGFzIGZwOgotICAgICAgICBmcC5zZXRmcmFtZXJhdGUoNDQxMDApCi0gICAgICAgIGZwLnNldHNhbXB3aWR0aCgyKQotICAgICAgICBmcC5zZXRuY2hhbm5lbHMoMSkKLSAgICAgICAgaWYgYXJnczoKLSAgICAgICAgICAgIHNvdXJjZSA9IFsnICcuam9pbihhcmdzKV0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNvdXJjZSA9IGl0ZXIoc3lzLnN0ZGluLnJlYWRsaW5lLCAnJykKLSAgICAgICAgZm9yIGxpbmUgaW4gc291cmNlOgotICAgICAgICAgICAgbWxpbmUgPSBtb3JzZShsaW5lKQotICAgICAgICAgICAgcGxheShtbGluZSwgZnAsIHdhdmUpCi0KLSMgQ29udmVydCBhIHN0cmluZyB0byBtb3JzZSBjb2RlIHdpdGggXDAwMSBiZXR3ZWVuIHRoZSBjaGFyYWN0ZXJzIGluCi0jIHRoZSBzdHJpbmcuCi1kZWYgbW9yc2UobGluZSk6Ci0gICAgcmVzID0gJycKLSAgICBmb3IgYyBpbiBsaW5lOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXMgKz0gbW9yc2V0YWJbY10gKyAnXDAwMScKLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgIHJldHVybiByZXMKLQotIyBQbGF5IGEgbGluZSBvZiBtb3JzZSBjb2RlLgotZGVmIHBsYXkobGluZSwgZnAsIHdhdmUpOgotICAgIGZvciBjIGluIGxpbmU6Ci0gICAgICAgIGlmIGMgPT0gJy4nOgotICAgICAgICAgICAgc2luZShmcCwgRE9ULCB3YXZlKQotICAgICAgICBlbGlmIGMgPT0gJy0nOgotICAgICAgICAgICAgc2luZShmcCwgREFILCB3YXZlKQotICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICAjIHNwYWNlCi0gICAgICAgICAgICBwYXVzZShmcCwgREFIICsgRE9UKQotICAgICAgICBwYXVzZShmcCwgRE9UKQotCi1kZWYgc2luZShmcCwgbGVuZ3RoLCB3YXZlKToKLSAgICBmb3IgaSBpbiByYW5nZShsZW5ndGgpOgotICAgICAgICBmcC53cml0ZWZyYW1lc3Jhdyh3YXZlKQotCi1kZWYgcGF1c2UoZnAsIGxlbmd0aCk6Ci0gICAgZm9yIGkgaW4gcmFuZ2UobGVuZ3RoKToKLSAgICAgICAgZnAud3JpdGVmcmFtZXNyYXcobm93YXZlKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvRGVtby9zY3JpcHRzL25ld3NsaXN0LmRvYyBiL0RlbW8vc2NyaXB0cy9uZXdzbGlzdC5kb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3ZmQ5YmEuLjAwMDAwMDAKLS0tIGEvRGVtby9zY3JpcHRzL25ld3NsaXN0LmRvYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVXU0xJU1QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09PT09PT0gICAgCi0gICAgICAgICAgICBBIHByb2dyYW0gdG8gYXNzaXN0IEhUVFAgYnJvd3Npbmcgb2YgbmV3c2dyb3VwcwotICAgICAgICAgICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotV1dXIGJyb3dzZXJzIHN1Y2ggYXMgTkNTQSBNb3NhaWMgYWxsb3cgdGhlIHVzZXIgdG8gcmVhZCBuZXdzZ3JvdXAKLWFydGljbGVzIGJ5IHNwZWNpZnlpbmcgdGhlIGdyb3VwIG5hbWUgaW4gYSBVUkwgZWcgJ25ld3M6Y29tcC5hbnN3ZXJzJy4KLQotVG8gYnJvd3NlIHRocm91Z2ggbWFueSBncm91cHMsIHRob3VnaCwgKGFuZCB0aGVyZSBhcmUgc2V2ZXJhbCB0aG91c2FuZAotb2YgdGhlbSkgeW91IHJlYWxseSBuZWVkIGEgcGFnZSBvciBwYWdlcyBjb250YWluaW5nIGxpbmtzIHRvIGFsbCB0aGUKLWdyb3Vwcy4gVGhlcmUgYXJlIHNvbWUgZ29vZCBvbmVzIG91dCB0aGVyZSwgZm9yIGV4YW1wbGUsCi0KLSAgICBodHRwOi8vaW5mby5jZXJuLmNoL2h5cGVydGV4dC9EYXRhU291cmNlcy9OZXdzL0dyb3Vwcy9PdmVydmlldy5odG1sCi0KLWlzIHRoZSBzdGFuZGFyZCBvbmUgYXQgQ0VSTiwgYnV0IGl0IG9ubHkgc2hvd3MgdGhlIGdyb3VwcyBhdmFpbGFibGUgdGhlcmUsCi13aGljaCBtYXkgYmUgcmF0aGVyIGRpZmZlcmVudCBmcm9tIHRob3NlIGF2YWlsYWJsZSBvbiB5b3VyIG1hY2hpbmUuCi0KLU5ld3NsaXN0IGlzIGEgcHJvZ3JhbSB3aGljaCBjcmVhdGVzIGEgaGllcmFyY2h5IG9mIHBhZ2VzIGZvciB5b3UgYmFzZWQKLW9uIHRoZSBncm91cHMgYXZhaWxhYmxlIGZyb20gWU9VUiBzZXJ2ZXIuIEl0IGlzIHdyaXR0ZW4gaW4gcHl0aG9uIC0gYQotc3BsZW5kaWQgaW50ZXJwcmV0ZWQgb2JqZWN0LW9yaWVudGVkIGxhbmd1YWdlIHdoaWNoIEkgc3VnZ2VzdCB5b3UgZ2V0Ci1yaWdodCBub3cgZnJvbSB0aGUgZGlyZWN0b3J5IC9wdWIvcHl0aG9uIGF0IGZ0cC5jd2kubmwsIGlmIHlvdSBoYXZlbid0Ci1hbHJlYWR5IGdvdCBpdC4KLQotWW91IHNob3VsZCBiZSBhYmxlIHRvIHNlZSBzb21lIHNhbXBsZSBvdXRwdXQgYnkgbG9va2luZyBhdDoKLSAgIGh0dHA6Ly9wZWxpY2FuLmNsLmNhbS5hYy51ay9uZXdzcGFnZS9yb290Lmh0bWwKLQotRGVzY3JpcHRpb25zIG9mIG5ld3Nncm91cHMgY2FuIGJlIGFkZGVkIGZyb20gYSBmaWxlIHdpdGggb25lIGdyb3VwCi1wZXIgbGluZS4gZWc6Ci0KLQlhbHQuZm9vICAgQXJ0aWNsZXMgYWJvdXQgZm9vCi0JY29tcC5iYXIgIFByb2dyYW1taW5nIGluICdiYXInIGFuZCByZWxhdGVkIGxhbmd1YWdlcwotCi1BIHN1aXRhYmxlIGxpc3QgZGV0YWlsaW5nIG1vc3QgZ3JvdXBzIGNhbiBiZSBmb3VuZCBhdCBmdHAudXUubmV0IGluCi0vdXVuZXQtaW5mby9uZXdzZ3JvdXBzLmd6LgotCi1NYWtlIHN1cmUgeW91IHJlYWQgdGhlIGluZm9ybWF0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb2dyYW0gc291cmNlIGFuZAotY29uZmlndXJlIHRoZSB2YXJpYWJsZXMgYmVmb3JlIHJ1bm5pbmcuCi0KLUluIGFkZGl0aW9uIHRvIHB5dGhvbiwgeW91IG5lZWQ6Ci0KLQlBbiBOTlRQLWJhc2VkIG5ld3MgZmVlZC4KLQlBIGRpcmVjdG9yeSBpbiB3aGljaCB0byBwdXQgdGhlIHBhZ2VzLgotCi1UaGUgcHJvZ3JhbW1pbmcgaXMgbm90IHZlcnkgYmVhdXRpZnVsLCBidXQgaXQgd29ya3MhICBJdCBjb21lcyB3aXRoIG5vCi13YXJyYW50eSwgZXhwcmVzcyBvciBpbXBsaWVkLCBidXQgd2l0aCB0aGUgaG9wZSB0aGF0IHNvbWUgb3RoZXJzIG1heQotZmluZCBpdCB1c2VmdWwuCi0KLUNvbW1lbnRzLCBpbXByb3ZlbWVudHMgJiBzdWdnZXN0aW9ucyB3ZWxjb21lZC4KLVF1ZW50aW4gU3RhZmZvcmQtRnJhc2VyCi0KLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgICAgIFF1ZW50aW4gU3RhZmZvcmQtRnJhc2VyCi0gICAgICAgICAgICBodHRwOi8vcGVsaWNhbi5jbC5jYW0uYWMudWsvcGVvcGxlL3FzMTAxL21lLmh0bWwKLSAKLSBDYW1icmlkZ2UgVW5pdmVyc2l0eSBDb21wdXRlciBMYWIgICAgICAgIFJhbmsgWGVyb3ggQ2FtYnJpZGdlIEV1cm9QQVJDCi0gcXMxMDFAY2wuY2FtLmFjLnVrICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhc2VyQGV1cm9wYXJjLnhlcm94LmNvbQotIFRlbDogKzQ0IDIyMyAzMzQ0MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbDogKzQ0IDIyMyAzNDE1MjEKLSBGYXg6ICs0NCAyMjMgMzM0Njc5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXg6ICs0NCAyMjMgMzQxNTEwCi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRGVtby9zY3JpcHRzL25ld3NsaXN0LnB5IGIvRGVtby9zY3JpcHRzL25ld3NsaXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMzQ1ZjJlZi4uMDAwMDAwMAotLS0gYS9EZW1vL3NjcmlwdHMvbmV3c2xpc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNjEgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5ld3NsaXN0ICAkUmV2aXNpb24kCi0jCi0jIFN5bnRheDoKLSMgICAgbmV3c2xpc3QgWyAtYSBdCi0jCi0jIFRoaXMgaXMgYSBwcm9ncmFtIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeSBmdWxsIG9mIEhUTUwgcGFnZXMKLSMgd2hpY2ggYmV0d2VlbiB0aGVtIGNvbnRhaW4gbGlua3MgdG8gYWxsIHRoZSBuZXdzZ3JvdXBzIGF2YWlsYWJsZQotIyBvbiB5b3VyIHNlcnZlci4KLSMKLSMgVGhlIC1hIG9wdGlvbiBjYXVzZXMgYSBjb21wbGV0ZSBsaXN0IG9mIGFsbCBncm91cHMgdG8gYmUgcmVhZCBmcm9tCi0jIHRoZSBzZXJ2ZXIgcmF0aGVyIHRoYW4ganVzdCB0aGUgb25lcyB3aGljaCBoYXZlIGFwcGVhcmVkIHNpbmNlIGxhc3QKLSMgZXhlY3V0aW9uLiBUaGlzIHJlY3JlYXRlcyB0aGUgbG9jYWwgbGlzdCBmcm9tIHNjcmF0Y2guIFVzZSB0aGlzIG9uCi0jIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHRoZSBwcm9ncmFtLCBhbmQgZnJvbSB0aW1lIHRvIHRpbWUgdGhlcmVhZnRlci4KLSMgICBXaGVuIG5ldyBncm91cHMgYXJlIGZpcnN0IGNyZWF0ZWQgdGhleSBtYXkgYXBwZWFyIG9uIHlvdXIgc2VydmVyIGFzCi0jIGVtcHR5IGdyb3Vwcy4gQnkgZGVmYXVsdCwgZW1wdHkgZ3JvdXBzIGFyZSBpZ25vcmVkIGJ5IHRoZSAtYSBvcHRpb24uCi0jIEhvd2V2ZXIsIHRoZXNlIG5ldyBncm91cHMgd2lsbCBub3QgYmUgY3JlYXRlZCBhZ2FpbiwgYW5kIHNvIHdpbGwgbm90Ci0jIGFwcGVhciBpbiB0aGUgc2VydmVyJ3MgbGlzdCBvZiAnbmV3IGdyb3VwcycgYXQgYSBsYXRlciBkYXRlLiBIZW5jZSBpdAotIyB3b24ndCBhcHBlYXIgdW50aWwgeW91IGRvIGEgJy1hJyBhZnRlciBzb21lIGFydGljbGVzIGhhdmUgYXBwZWFyZWQuCi0jCi0jIEkgc2hvdWxkIHJlYWxseSBrZWVwIGEgbGlzdCBvZiBpZ25vcmVkIGVtcHR5IGdyb3VwcyBhbmQgcmUtY2hlY2sgdGhlbQotIyBmb3IgYXJ0aWNsZXMgb24gZXZlcnkgcnVuLCBidXQgSSBoYXZlbid0IGdvdCBhcm91bmQgdG8gaXQgeWV0LgotIwotIyBUaGlzIGFzc3VtZXMgYW4gTk5UUCBuZXdzIGZlZWQuCi0jCi0jIEZlZWwgZnJlZSB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhpcyBjb2RlIGZvcgotIyBub24tY29tbWVyY2lhbCB1c2UuIElmIHlvdSBtYWtlIGFueSB1c2VmdWwgbW9kaWZpY2F0aW9ucywgbGV0IG1lCi0jIGtub3chCi0jCi0jIChjKSBRdWVudGluIFN0YWZmb3JkLUZyYXNlciAxOTk0Ci0jIGZyYXNlckBldXJvcGFyYy54ZXJveC5jb20gICAgICAgICAgICAgICAgICAgICBxczEwMUBjbC5jYW0uYWMudWsKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotaW1wb3J0IHN5cywgbm50cGxpYiwgbWFyc2hhbCwgdGltZSwgb3MKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ2hlY2sgdGhlc2UgdmFyaWFibGVzIGJlZm9yZSBydW5uaW5nISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCi0KLSMgVG9wIGRpcmVjdG9yeS4KLSMgRmlsZW5hbWVzIHdoaWNoIGRvbid0IHN0YXJ0IHdpdGggLyBhcmUgdGFrZW4gYXMgYmVpbmcgcmVsYXRpdmUgdG8gdGhpcy4KLXRvcGRpciA9IG9zLnBhdGguZXhwYW5kdXNlcignfi9uZXdzcGFnZScpCi0KLSMgVGhlIG5hbWUgb2YgeW91ciBOTlRQIGhvc3QKLSMgZWcuCi0jICAgIG5ld3Nob3N0ID0gJ25udHAtc2Vydi5jbC5jYW0uYWMudWsnCi0jIG9yIHVzZSBmb2xsb3dpbmcgdG8gZ2V0IHRoZSBuYW1lIGZyb20gdGhlIE5OVFBTRVJWRVIgZW52aXJvbm1lbnQKLSMgdmFyaWFibGU6Ci0jICAgIG5ld3Nob3N0ID0gb3MuZW52aXJvblsnTk5UUFNFUlZFUiddCi1uZXdzaG9zdCA9ICduZXdzLmV4YW1wbGUuY29tJwotCi0jIFRoZSBmaWxlbmFtZSBmb3IgYSBsb2NhbCBjYWNoZSBvZiB0aGUgbmV3c2dyb3VwIGxpc3QKLXRyZWVmaWxlID0gJ2dyb3VwdHJlZScKLQotIyBUaGUgZmlsZW5hbWUgZm9yIGRlc2NyaXB0aW9ucyBvZiBuZXdzZ3JvdXBzCi0jIEkgZm91bmQgYSBzdWl0YWJsZSBvbmUgYXQgZnRwLnV1Lm5ldCBpbiAvdXVuZXQtaW5mby9uZXdncm91cHMuZ3oKLSMgWW91IGNhbiBzZXQgdGhpcyB0byAnJyBpZiB5b3UgZG9uJ3Qgd2lzaCB0byB1c2Ugb25lLgotZGVzY2ZpbGUgPSAnbmV3c2dyb3VwcycKLQotIyBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIEhUTUwgcGFnZXMgc2hvdWxkIGJlIGNyZWF0ZWQKLSMgZWcuCi0jICAgcGFnZWRpciAgPSAnL3Vzci9sb2NhbC9saWIvaHRtbC9uZXdzcGFnZScKLSMgICBwYWdlZGlyICA9ICdwYWdlcycKLXBhZ2VkaXIgID0gdG9wZGlyCi0KLSMgVGhlIGh0bWwgcHJlZml4IHdoaWNoIHdpbGwgcmVmZXIgdG8gdGhpcyBkaXJlY3RvcnkKLSMgZWcuCi0jICAgaHR0cHByZWYgPSAnL25ld3NwYWdlLycsCi0jIG9yIGxlYXZlIGJsYW5rIGZvciByZWxhdGl2ZSBsaW5rcyBiZXR3ZWVuIHBhZ2VzOiAoUmVjb21tZW5kZWQpCi0jICAgaHR0cHByZWYgPSAnJwotaHR0cHByZWYgPSAnJwotCi0jIFRoZSBuYW1lIG9mIHRoZSAncm9vdCcgbmV3cyBwYWdlIGluIHRoaXMgZGlyZWN0b3J5LgotIyBBIC5odG1sIHN1ZmZpeCB3aWxsIGJlIGFkZGVkLgotcm9vdHBhZ2UgPSAncm9vdCcKLQotIyBTZXQgc2tpcGVtcHR5IHRvIDAgaWYgeW91IHdpc2ggdG8gc2VlIGxpbmtzIHRvIGVtcHR5IGdyb3VwcyBhcyB3ZWxsLgotIyBPbmx5IGFmZmVjdHMgdGhlIC1hIG9wdGlvbi4KLXNraXBlbXB0eSA9IDEKLQotIyBwYWdlbGlua2ljb24gY2FuIGNvbnRhaW4gaHRtbCB0byBwdXQgYW4gaWNvbiBhZnRlciBsaW5rcyB0bwotIyBmdXJ0aGVyIHBhZ2VzLiBUaGlzIGhlbHBzIHRvIG1ha2UgaW1wb3J0YW50IGxpbmtzIHN0YW5kIG91dC4KLSMgU2V0IHRvICcnIGlmIG5vdCB3YW50ZWQsIG9yICcuLi4nIGlzIHF1aXRlIGEgZ29vZCBvbmUuCi1wYWdlbGlua2ljb24gPSAnLi4uIDxpbWcgc3JjPSJodHRwOi8vcGVsaWNhbi5jbC5jYW0uYWMudWsvaWNvbnMvcGFnZS54Ym0iPiAnCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIExlc3MgaW1wb3J0YW50IHBlcnNvbmFsIHByZWZlcmVuY2VzOgotCi0jIFN1Ymxpc3RzaXplIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGUgd2lsbCBhcHBlYXIgYXMKLSMgYW4gaW5kZW50ZWQgc3ViLWxpc3QgYmVmb3JlIHRoZSB3aG9sZSB0aGluZyBpcyBtb3ZlZCBvbnRvIGEgZGlmZmVyZW50Ci0jIHBhZ2UuIFRoZSBzbWFsbGVyIHRoaXMgaXMsIHRoZSBtb3JlIHBhZ2VzIHlvdSB3aWxsIGhhdmUsIGJ1dCB0aGUKLSMgc2hvcnRlciBlYWNoIHdpbGwgYmUuCi1zdWJsaXN0c2l6ZSA9IDQKLQotIyBUaGF0IHNob3VsZCBiZSBhbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWZvciBkaXIgaW4gb3MuY3VyZGlyLCBvcy5lbnZpcm9uWydIT01FJ106Ci0gICAgcmNmaWxlID0gb3MucGF0aC5qb2luKGRpciwgJy5uZXdzbGlzdHJjLnB5JykKLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhyY2ZpbGUpOgotICAgICAgICBwcmludChyY2ZpbGUpCi0gICAgICAgIGV4ZWMob3BlbihyY2ZpbGUpLnJlYWQoKSkKLSAgICAgICAgYnJlYWsKLQotZnJvbSBubnRwbGliIGltcG9ydCBOTlRQCi1mcm9tIHN0YXQgaW1wb3J0ICoKLQotcmNzcmV2ID0gJyRSZXZpc2lvbiQnCi1yY3NyZXYgPSAnICcuam9pbihbcyBmb3IgcyBpbiByY3NyZXYuc3BsaXQoKSBpZiAnJCcgbm90IGluIHNdKQotZGVzYyA9IHt9Ci0KLSMgTWFrZSAocG9zc2libHkpIHJlbGF0aXZlIGZpbGVuYW1lcyBpbnRvIGFic29sdXRlIG9uZXMKLXRyZWVmaWxlID0gb3MucGF0aC5qb2luKHRvcGRpcix0cmVlZmlsZSkKLWRlc2NmaWxlID0gb3MucGF0aC5qb2luKHRvcGRpcixkZXNjZmlsZSkKLXBhZ2UgPSBvcy5wYXRoLmpvaW4odG9wZGlyLHBhZ2VkaXIpCi0KLSMgRmlyc3QgdGhlIGJpdHMgZm9yIGNyZWF0aW5nIHRyZWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIEFkZHRvdHJlZSBjcmVhdGVzL2F1Z21lbnRzIGEgdHJlZSBmcm9tIGEgbGlzdCBvZiBncm91cCBuYW1lcwotZGVmIGFkZHRvdHJlZSh0cmVlLCBncm91cHMpOgotICAgIHByaW50KCdVcGRhdGluZyB0cmVlLi4uJykKLSAgICBmb3IgaSBpbiBncm91cHM6Ci0gICAgICAgIHBhcnRzID0gaS5zcGxpdCgnLicpCi0gICAgICAgIG1ha2VsZWFmKHRyZWUsIHBhcnRzKQotCi0jIE1ha2VsZWFmIG1ha2VzIGEgbGVhZiBhbmQgdGhlIGJyYW5jaCBsZWFkaW5nIHRvIGl0IGlmIG5lY2Vzc2FyeQotZGVmIG1ha2VsZWFmKHRyZWUscGF0aCk6Ci0gICAgaiA9IHBhdGhbMF0KLSAgICBsID0gbGVuKHBhdGgpCi0KLSAgICBpZiBqIG5vdCBpbiB0cmVlOgotICAgICAgICB0cmVlW2pdID0ge30KLSAgICBpZiBsID09IDE6Ci0gICAgICAgIHRyZWVbal1bJy4nXSA9ICcuJwotICAgIGlmIGwgPiAxOgotICAgICAgICBtYWtlbGVhZih0cmVlW2pdLHBhdGhbMTpdKQotCi0jIFRoZW4gdGhlIGJpdHMgZm9yIG91dHB1dHRpbmcgdHJlZXMgYXMgcGFnZXMgLS0tLS0tLS0tLS0tLS0tLQotCi0jIENyZWF0ZXBhZ2UgY3JlYXRlcyBhbiBIVE1MIGZpbGUgbmFtZWQgPHJvb3Q+Lmh0bWwgY29udGFpbmluZyBsaW5rcwotIyB0byB0aG9zZSBncm91cHMgYmVnaW5uaW5nIHdpdGggPHJvb3Q+LgotCi1kZWYgY3JlYXRlcGFnZShyb290LCB0cmVlLCBwKToKLSAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihwYWdlZGlyLCByb290KycuaHRtbCcpCi0gICAgaWYgcm9vdCA9PSByb290cGFnZToKLSAgICAgICAgZGV0YWlsID0gJycKLSAgICBlbHNlOgotICAgICAgICBkZXRhaWwgPSAnIHVuZGVyICcgKyByb290Ci0gICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAndycpIGFzIGY6Ci0gICAgICAgICMgZi53cml0ZSgnQ29udGVudC1UeXBlOiB0ZXh0L2h0bWxcbicpCi0gICAgICAgIGYud3JpdGUoJzxodG1sPlxuPGhlYWQ+XG4nKQotICAgICAgICBmLndyaXRlKCc8dGl0bGU+TmV3c2dyb3VwcyBhdmFpbGFibGUlczwvdGl0bGU+XG4nICUgZGV0YWlsKQotICAgICAgICBmLndyaXRlKCc8L2hlYWQ+XG48Ym9keT5cbicpCi0gICAgICAgIGYud3JpdGUoJzxoMT5OZXdzZ3JvdXBzIGF2YWlsYWJsZSVzPC9oMT5cbicgJSBkZXRhaWwpCi0gICAgICAgIGYud3JpdGUoJzxhIGhyZWY9IiVzJXMuaHRtbCI+QmFjayB0byB0b3AgbGV2ZWw8L2E+PHA+XG4nICUKLSAgICAgICAgICAgICAgICAoaHR0cHByZWYsIHJvb3RwYWdlKSkKLSAgICAgICAgcHJpbnR0cmVlKGYsIHRyZWUsIDAsIHApCi0gICAgICAgIGYud3JpdGUoJ1xuPHA+JykKLSAgICAgICAgZi53cml0ZSgiPGk+VGhpcyBwYWdlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSAnbmV3c2xpc3QnIHYuICVzLiIgJQotICAgICAgICAgICAgICAgIHJjc3JldikKLSAgICAgICAgZi53cml0ZSh0aW1lLmN0aW1lKHRpbWUudGltZSgpKSArICc8L2k+XG4nKQotICAgICAgICBmLndyaXRlKCc8L2JvZHk+XG48L2h0bWw+XG4nKQotCi0jIFByaW50dHJlZSBwcmludHMgdGhlIGdyb3VwcyBhcyBhIGJ1bGxldGVkIGxpc3QuICBHcm91cHMgd2l0aAotIyBtb3JlIHRoYW4gPHN1Ymxpc3RzaXplPiBzdWJncm91cHMgd2lsbCBiZSBwdXQgb24gYSBzZXBhcmF0ZSBwYWdlLgotIyBPdGhlciBzZXRzIG9mIHN1Ymdyb3VwcyBhcmUganVzdCBpbmRlbnRlZC4KLQotZGVmIHByaW50dHJlZShmLCB0cmVlLCBpbmRlbnQsIHApOgotICAgIGwgPSBsZW4odHJlZSkKLQotICAgIGlmIGwgPiBzdWJsaXN0c2l6ZSBhbmQgaW5kZW50ID4gMDoKLSAgICAgICAgIyBDcmVhdGUgYSBuZXcgcGFnZSBhbmQgYSBsaW5rIHRvIGl0Ci0gICAgICAgIGYud3JpdGUoJzxsaT48Yj48YSBocmVmPSIlcyVzLmh0bWwiPicgJSAoaHR0cHByZWYsIHBbMTpdKSkKLSAgICAgICAgZi53cml0ZShwWzE6XSArICcuKicpCi0gICAgICAgIGYud3JpdGUoJzwvYT48L2I+JXNcbicgJSBwYWdlbGlua2ljb24pCi0gICAgICAgIGNyZWF0ZXBhZ2UocFsxOl0sIHRyZWUsIHApCi0gICAgICAgIHJldHVybgotCi0gICAga2wgPSBzb3J0ZWQodHJlZS5rZXlzKCkpCi0KLSAgICBpZiBsID4gMToKLSAgICAgICAgaWYgaW5kZW50ID4gMDoKLSAgICAgICAgICAgICMgQ3JlYXRlIGEgc3ViLWxpc3QKLSAgICAgICAgICAgIGYud3JpdGUoJzxsaT4lc1xuPHVsPicgJSBwWzE6XSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgQ3JlYXRlIGEgbWFpbiBsaXN0Ci0gICAgICAgICAgICBmLndyaXRlKCc8dWw+JykKLSAgICAgICAgaW5kZW50ID0gaW5kZW50ICsgMQotCi0gICAgZm9yIGkgaW4ga2w6Ci0gICAgICAgIGlmIGkgPT0gJy4nOgotICAgICAgICAgICAgIyBPdXRwdXQgYSBuZXdzZ3JvdXAKLSAgICAgICAgICAgIGYud3JpdGUoJzxsaT48YSBocmVmPSJuZXdzOiVzIj4lczwvYT4gJyAlIChwWzE6XSwgcFsxOl0pKQotICAgICAgICAgICAgaWYgcFsxOl0gaW4gZGVzYzoKLSAgICAgICAgICAgICAgICBmLndyaXRlKCcgICAgIDxpPiVzPC9pPlxuJyAlIGRlc2NbcFsxOl1dKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBmLndyaXRlKCdcbicpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIE91dHB1dCBhIGhpZXJhcmNoeQotICAgICAgICAgICAgcHJpbnR0cmVlKGYsIHRyZWVbaV0sIGluZGVudCwgcCsnLicraSkKLQotICAgIGlmIGwgPiAxOgotICAgICAgICBmLndyaXRlKCdcbjwvdWw+JykKLQotIyBSZWFkaW5nIGRlc2NyaXB0aW9ucyBmaWxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jIFRoaXMgcmV0dXJucyBhIGRpY3QgbWFwcGluZyBncm91cCBuYW1lIHRvIGl0cyBkZXNjcmlwdGlvbgotCi1kZWYgcmVhZGRlc2MoZGVzY2ZpbGUpOgotICAgIGdsb2JhbCBkZXNjCi0gICAgZGVzYyA9IHt9Ci0KLSAgICBpZiBkZXNjZmlsZSA9PSAnJzoKLSAgICAgICAgcmV0dXJuCi0KLSAgICB0cnk6Ci0gICAgICAgIHdpdGggb3BlbihkZXNjZmlsZSwgJ3InKSBhcyBkOgotICAgICAgICAgICAgcHJpbnQoJ1JlYWRpbmcgZGVzY3JpcHRpb25zLi4uJykKLSAgICAgICAgICAgIGZvciBsIGluIGQ6Ci0gICAgICAgICAgICAgICAgYml0cyA9IGwuc3BsaXQoKQotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgZ3JwID0gYml0c1swXQotICAgICAgICAgICAgICAgICAgICBkc2MgPSAnICcuam9pbihiaXRzWzE6XSkKLSAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGRzYykgPiAxOgotICAgICAgICAgICAgICAgICAgICAgICAgZGVzY1tncnBdID0gZHNjCi0gICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHBhc3MKLSAgICBleGNlcHQgSU9FcnJvcjoKLSAgICAgICAgcHJpbnQoJ0ZhaWxlZCB0byBvcGVuIGRlc2NyaXB0aW9uIGZpbGUgJyArIGRlc2NmaWxlKQotICAgICAgICByZXR1cm4KLQotIyBDaGVjayB0aGF0IG91cHV0IGRpcmVjdG9yeSBleGlzdHMsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBhbmQgb2ZmZXIgdG8gY3JlYXRlIGl0IGlmIG5vdAotCi1kZWYgY2hlY2tvcGRpcihwYWdlZGlyKToKLSAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYWdlZGlyKToKLSAgICAgICAgcHJpbnQoJ0RpcmVjdG9yeSAlcyBkb2VzIG5vdCBleGlzdC4nICUgcGFnZWRpcikKLSAgICAgICAgcHJpbnQoJ1NoYWxsIEkgY3JlYXRlIGl0IGZvciB5b3U/ICh5L24pJykKLSAgICAgICAgaWYgc3lzLnN0ZGluLnJlYWRsaW5lKClbMF0gPT0gJ3knOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG9zLm1rZGlyKHBhZ2VkaXIsIDBvNzc3KQotICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgIHByaW50KCdTb3JyeSAtIGZhaWxlZCEnKQotICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCgnT0suIEV4aXRpbmcuJykKLSAgICAgICAgICAgIHN5cy5leGl0KDEpCi0KLSMgUmVhZCBhbmQgd3JpdGUgY3VycmVudCBsb2NhbCB0cmVlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZGVmIHJlYWRsb2NhbGxpc3QodHJlZWZpbGUpOgotICAgIHByaW50KCdSZWFkaW5nIGN1cnJlbnQgbG9jYWwgZ3JvdXAgbGlzdC4uLicpCi0gICAgdHJlZSA9IHt9Ci0gICAgdHJ5OgotICAgICAgICB0cmVldGltZSA9IHRpbWUubG9jYWx0aW1lKG9zLnN0YXQodHJlZWZpbGUpW1NUX01USU1FXSkKLSAgICBleGNlcHQ6Ci0gICAgICAgIHByaW50KCdcbioqKiBGYWlsZWQgdG8gb3BlbiBsb2NhbCBncm91cCBjYWNoZSAnK3RyZWVmaWxlKQotICAgICAgICBwcmludCgnSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB5b3UgaGF2ZSBydW4gbmV3c2xpc3QsIHRoZW4nKQotICAgICAgICBwcmludCgndXNlIHRoZSAtYSBvcHRpb24gdG8gY3JlYXRlIGl0LicpCi0gICAgICAgIHN5cy5leGl0KDEpCi0gICAgdHJlZWRhdGUgPSAnJTAyZCUwMmQlMDJkJyAlICh0cmVldGltZVswXSAlIDEwMCwgdHJlZXRpbWVbMV0sIHRyZWV0aW1lWzJdKQotICAgIHRyeToKLSAgICAgICAgd2l0aCBvcGVuKHRyZWVmaWxlLCAncmInKSBhcyBkdW1wOgotICAgICAgICAgICAgdHJlZSA9IG1hcnNoYWwubG9hZChkdW1wKQotICAgIGV4Y2VwdCBJT0Vycm9yOgotICAgICAgICBwcmludCgnQ2Fubm90IG9wZW4gbG9jYWwgZ3JvdXAgbGlzdCAnICsgdHJlZWZpbGUpCi0gICAgcmV0dXJuICh0cmVlLCB0cmVlZGF0ZSkKLQotZGVmIHdyaXRlbG9jYWxsaXN0KHRyZWVmaWxlLCB0cmVlKToKLSAgICB0cnk6Ci0gICAgICAgIHdpdGggb3Blbih0cmVlZmlsZSwgJ3diJykgYXMgZHVtcDoKLSAgICAgICAgICAgIGdyb3VwcyA9IG1hcnNoYWwuZHVtcCh0cmVlLCBkdW1wKQotICAgICAgICBwcmludCgnU2F2ZWQgbGlzdCB0byAlc1xuJyAlIHRyZWVmaWxlKQotICAgIGV4Y2VwdDoKLSAgICAgICAgcHJpbnQoJ1NvcnJ5IC0gZmFpbGVkIHRvIHdyaXRlIHRvIGxvY2FsIGdyb3VwIGNhY2hlJywgdHJlZWZpbGUpCi0gICAgICAgIHByaW50KCdEb2VzIGl0IChvciBpdHMgZGlyZWN0b3J5KSBoYXZlIHRoZSBjb3JyZWN0IHBlcm1pc3Npb25zPycpCi0gICAgICAgIHN5cy5leGl0KDEpCi0KLSMgUmV0dXJuIGxpc3Qgb2YgYWxsIGdyb3VwcyBvbiBzZXJ2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZGVmIGdldGFsbGdyb3VwcyhzZXJ2ZXIpOgotICAgIHByaW50KCdHZXR0aW5nIGxpc3Qgb2YgYWxsIGdyb3Vwcy4uLicpCi0gICAgdHJlZWRhdGUgPSAnMDEwMTAxJwotICAgIGluZm8gPSBzZXJ2ZXIubGlzdCgpWzFdCi0gICAgZ3JvdXBzID0gW10KLSAgICBwcmludCgnUHJvY2Vzc2luZy4uLicpCi0gICAgaWYgc2tpcGVtcHR5OgotICAgICAgICBwcmludCgnXG5JZ25vcmluZyBmb2xsb3dpbmcgZW1wdHkgZ3JvdXBzOicpCi0gICAgZm9yIGkgaW4gaW5mbzoKLSAgICAgICAgZ3JwbmFtZSA9IGlbMF0uc3BsaXQoKVswXQotICAgICAgICBpZiBza2lwZW1wdHkgYW5kIGludChpWzFdKSA8IGludChpWzJdKToKLSAgICAgICAgICAgIHByaW50KGdycG5hbWUuZGVjb2RlKCkgKyAnICcsIGVuZD0nICcpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBncm91cHMuYXBwZW5kKGdycG5hbWUuZGVjb2RlKCkpCi0gICAgcHJpbnQoJ1xuJykKLSAgICBpZiBza2lwZW1wdHk6Ci0gICAgICAgIHByaW50KCcoRW5kIG9mIGVtcHR5IGdyb3VwcyknKQotICAgIHJldHVybiBncm91cHMKLQotIyBSZXR1cm4gbGlzdCBvZiBuZXcgZ3JvdXBzIG9uIHNlcnZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1kZWYgZ2V0bmV3Z3JvdXBzKHNlcnZlciwgdHJlZWRhdGUpOgotICAgIHByaW50KCdHZXR0aW5nIGxpc3Qgb2YgbmV3IGdyb3VwcyBzaW5jZSBzdGFydCBvZiAlcy4uLicgJSB0cmVlZGF0ZSwgZW5kPScgJykKLSAgICBpbmZvID0gc2VydmVyLm5ld2dyb3Vwcyh0cmVlZGF0ZSwgJzAwMDAwMScpWzFdCi0gICAgcHJpbnQoJ2dvdCAlZC4nICUgbGVuKGluZm8pKQotICAgIHByaW50KCdQcm9jZXNzaW5nLi4uJywgZW5kPScgJykKLSAgICBncm91cHMgPSBbXQotICAgIGZvciBpIGluIGluZm86Ci0gICAgICAgIGdycG5hbWUgPSBpLnNwbGl0KClbMF0KLSAgICAgICAgZ3JvdXBzLmFwcGVuZChncnBuYW1lLmRlY29kZSgpKQotICAgIHByaW50KCdEb25lJykKLSAgICByZXR1cm4gZ3JvdXBzCi0KLSMgTm93IHRoZSBtYWluIHByb2dyYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotZGVmIG1haW4oKToKLSAgICB0cmVlID0ge30KLQotICAgICMgQ2hlY2sgdGhhdCB0aGUgb3V0cHV0IGRpcmVjdG9yeSBleGlzdHMKLSAgICBjaGVja29wZGlyKHBhZ2VkaXIpCi0KLSAgICB0cnk6Ci0gICAgICAgIHByaW50KCdDb25uZWN0aW5nIHRvICVzLi4uJyAlIG5ld3Nob3N0KQotICAgICAgICBpZiBzeXMudmVyc2lvblswXSA9PSAnMCc6Ci0gICAgICAgICAgICBzID0gTk5UUC5pbml0KG5ld3Nob3N0KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcyA9IE5OVFAobmV3c2hvc3QpCi0gICAgICAgIGNvbm5lY3RlZCA9IFRydWUKLSAgICBleGNlcHQgKG5udHBsaWIuZXJyb3JfdGVtcCwgbm50cGxpYi5lcnJvcl9wZXJtKSBhcyB4OgotICAgICAgICBwcmludCgnRXJyb3IgY29ubmVjdGluZyB0byBob3N0OicsIHgpCi0gICAgICAgIHByaW50KCdJXCdsbCB0cnkgdG8gdXNlIGp1c3QgdGhlIGxvY2FsIGxpc3QuJykKLSAgICAgICAgY29ubmVjdGVkID0gRmFsc2UKLQotICAgICMgSWYgLWEgaXMgc3BlY2lmaWVkLCByZWFkIHRoZSBmdWxsIGxpc3Qgb2YgZ3JvdXBzIGZyb20gc2VydmVyCi0gICAgaWYgY29ubmVjdGVkIGFuZCBsZW4oc3lzLmFyZ3YpID4gMSBhbmQgc3lzLmFyZ3ZbMV0gPT0gJy1hJzoKLSAgICAgICAgZ3JvdXBzID0gZ2V0YWxsZ3JvdXBzKHMpCi0KLSAgICAjIE90aGVyd2lzZSBqdXN0IHJlYWQgdGhlIGxvY2FsIGZpbGUgYW5kIHRoZW4gYWRkCi0gICAgIyBncm91cHMgY3JlYXRlZCBzaW5jZSBsb2NhbCBmaWxlIGxhc3QgbW9kaWZpZWQuCi0gICAgZWxzZToKLQotICAgICAgICAodHJlZSwgdHJlZWRhdGUpID0gcmVhZGxvY2FsbGlzdCh0cmVlZmlsZSkKLSAgICAgICAgaWYgY29ubmVjdGVkOgotICAgICAgICAgICAgZ3JvdXBzID0gZ2V0bmV3Z3JvdXBzKHMsIHRyZWVkYXRlKQotCi0gICAgaWYgY29ubmVjdGVkOgotICAgICAgICBhZGR0b3RyZWUodHJlZSwgZ3JvdXBzKQotICAgICAgICB3cml0ZWxvY2FsbGlzdCh0cmVlZmlsZSx0cmVlKQotCi0gICAgIyBSZWFkIGdyb3VwIGRlc2NyaXB0aW9ucwotICAgIHJlYWRkZXNjKGRlc2NmaWxlKQotCi0gICAgcHJpbnQoJ0NyZWF0aW5nIHBhZ2VzLi4uJykKLSAgICBjcmVhdGVwYWdlKHJvb3RwYWdlLCB0cmVlLCAnJykKLSAgICBwcmludCgnRG9uZScpCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCi0KLSMgVGhhdCdzIGFsbCBmb2xrcwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvRGVtby9zY3JpcHRzL3BpLnB5IGIvRGVtby9zY3JpcHRzL3BpLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyNDhmODFmLi4wMDAwMDAwCi0tLSBhL0RlbW8vc2NyaXB0cy9waS5weQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24zCi0KLSMgUHJpbnQgZGlnaXRzIG9mIHBpIGZvcmV2ZXIuCi0jCi0jIFRoZSBhbGdvcml0aG0sIHVzaW5nIFB5dGhvbidzICdsb25nJyBpbnRlZ2VycyAoImJpZ251bXMiKSwgd29ya3MKLSMgd2l0aCBjb250aW51ZWQgZnJhY3Rpb25zLCBhbmQgd2FzIGNvbmNlaXZlZCBieSBMYW1iZXJ0IE1lZXJ0ZW5zLgotIwotIyBTZWUgYWxzbyB0aGUgQUJDIFByb2dyYW1tZXIncyBIYW5kYm9vaywgYnkgR2V1cnRzLCBNZWVydGVucyAmIFBlbWJlcnRvbiwKLSMgcHVibGlzaGVkIGJ5IFByZW50aWNlLUhhbGwgKFVLKSBMdGQuLCAxOTkwLgotCi1pbXBvcnQgc3lzCi0KLWRlZiBtYWluKCk6Ci0gICAgaywgYSwgYiwgYTEsIGIxID0gMiwgNCwgMSwgMTIsIDQKLSAgICB3aGlsZSBUcnVlOgotICAgICAgICAjIE5leHQgYXBwcm94aW1hdGlvbgotICAgICAgICBwLCBxLCBrID0gayprLCAyKmsrMSwgaysxCi0gICAgICAgIGEsIGIsIGExLCBiMSA9IGExLCBiMSwgcCphK3EqYTEsIHAqYitxKmIxCi0gICAgICAgICMgUHJpbnQgY29tbW9uIGRpZ2l0cwotICAgICAgICBkLCBkMSA9IGEvL2IsIGExLy9iMQotICAgICAgICB3aGlsZSBkID09IGQxOgotICAgICAgICAgICAgb3V0cHV0KGQpCi0gICAgICAgICAgICBhLCBhMSA9IDEwKihhJWIpLCAxMCooYTElYjEpCi0gICAgICAgICAgICBkLCBkMSA9IGEvL2IsIGExLy9iMQotCi1kZWYgb3V0cHV0KGQpOgotICAgICMgVXNlIHdyaXRlKCkgdG8gYXZvaWQgc3BhY2VzIGJldHdlZW4gdGhlIGRpZ2l0cwotICAgIHN5cy5zdGRvdXQud3JpdGUoc3RyKGQpKQotICAgICMgRmx1c2ggc28gdGhlIG91dHB1dCBpcyBzZWVuIGltbWVkaWF0ZWx5Ci0gICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgbWFpbigpCmRpZmYgLS1naXQgYS9EZW1vL3NjcmlwdHMvcHAucHkgYi9EZW1vL3NjcmlwdHMvcHAucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3YjlkOGYuLjAwMDAwMDAKLS0tIGEvRGVtby9zY3JpcHRzL3BwLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24zCi0KLSMgRW11bGF0ZSBzb21lIFBlcmwgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0jIFVzYWdlOiBwcCBbLWFdIFstY10gWy1kXSBbLWUgc2NyaXB0bGluZV0gWy1GIGZpZWxkc2VwXSBbLW5dIFstcF0gW2ZpbGVdIC4uLgotIyBXaGVyZSB0aGUgb3B0aW9ucyBtZWFuIHRoZSBmb2xsb3dpbmc6Ci0jICAgLWEgICAgICAgICAgICA6IHRvZ2V0aGVyIHdpdGggLW4gb3IgLXAsIHNwbGl0cyBlYWNoIGxpbmUgaW50byBsaXN0IEYKLSMgICAtYyAgICAgICAgICAgIDogY2hlY2sgc3ludGF4IG9ubHksIGRvIG5vdCBleGVjdXRlIGFueSBjb2RlCi0jICAgLWQgICAgICAgICAgICA6IHJ1biB0aGUgc2NyaXB0IHVuZGVyIHRoZSBkZWJ1Z2dlciwgcGRiCi0jICAgLWUgc2NyaXB0bGluZSA6IGdpdmVzIG9uZSBsaW5lIG9mIHRoZSBQeXRob24gc2NyaXB0OyBtYXkgYmUgcmVwZWF0ZWQKLSMgICAtRiBmaWVsZHNlcCAgIDogc2V0cyB0aGUgZmllbGQgc2VwYXJhdG9yIGZvciB0aGUgLWEgb3B0aW9uIFtub3QgaW4gUGVybF0KLSMgICAtbiAgICAgICAgICAgIDogcnVucyB0aGUgc2NyaXB0IGZvciBlYWNoIGxpbmUgb2YgaW5wdXQKLSMgICAtcCAgICAgICAgICAgIDogcHJpbnRzIHRoZSBsaW5lIGFmdGVyIHRoZSBzY3JpcHQgaGFzIHJ1bgotIyBXaGVuIG5vIHNjcmlwdCBsaW5lcyBoYXZlIGJlZW4gcGFzc2VkLCB0aGUgZmlyc3QgZmlsZSBhcmd1bWVudAotIyBjb250YWlucyB0aGUgc2NyaXB0LiAgV2l0aCAtbiBvciAtcCwgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlCi0jIHJlYWQgYXMgaW5wdXQgdG8gdGhlIHNjcmlwdCwgbGluZSBieSBsaW5lLiAgSWYgYSBmaWxlIGlzICctJwotIyBvciBtaXNzaW5nLCBzdGFuZGFyZCBpbnB1dCBpcyByZWFkLgotCi0jIFhYWCBUbyBkbzoKLSMgLSBhZGQgLWkgZXh0ZW5zaW9uIG9wdGlvbiAoY2hhbmdlIGZpbGVzIGluIHBsYWNlKQotIyAtIG1ha2UgYSBzaW5nbGUgbG9vcCBvdmVyIHRoZSBmaWxlcyBhbmQgbGluZXMgKGNoYW5nZXMgZWZmZWN0IG9mICdicmVhaycpPwotIyAtIGFkZCBhbiBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcmVjb3JkIHNlcGFyYXRvcgotIyAtIGV4Y2VwdCBmb3IgLW4vLXAsIHJ1biBkaXJlY3RseSBmcm9tIHRoZSBmaWxlIGlmIGF0IGFsbCBwb3NzaWJsZQotCi1pbXBvcnQgc3lzCi1pbXBvcnQgZ2V0b3B0Ci0KLUZTID0gJycKLVNDUklQVCA9IFtdCi1BRkxBRyA9IDAKLUNGTEFHID0gMAotREZMQUcgPSAwCi1ORkxBRyA9IDAKLVBGTEFHID0gMAotCi10cnk6Ci0gICAgb3B0bGlzdCwgQVJHUyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnYWNkZTpGOm5wJykKLWV4Y2VwdCBnZXRvcHQuZXJyb3IgYXMgbXNnOgotICAgIHN5cy5zdGRlcnIud3JpdGUoJyVzOiAlc1xuJyAlIChzeXMuYXJndlswXSwgbXNnKSkKLSAgICBzeXMuZXhpdCgyKQotCi1mb3Igb3B0aW9uLCBvcHRhcmcgaW4gb3B0bGlzdDoKLSAgICBpZiBvcHRpb24gPT0gJy1hJzoKLSAgICAgICAgQUZMQUcgPSAxCi0gICAgZWxpZiBvcHRpb24gPT0gJy1jJzoKLSAgICAgICAgQ0ZMQUcgPSAxCi0gICAgZWxpZiBvcHRpb24gPT0gJy1kJzoKLSAgICAgICAgREZMQUcgPSAxCi0gICAgZWxpZiBvcHRpb24gPT0gJy1lJzoKLSAgICAgICAgZm9yIGxpbmUgaW4gb3B0YXJnLnNwbGl0KCdcbicpOgotICAgICAgICAgICAgU0NSSVBULmFwcGVuZChsaW5lKQotICAgIGVsaWYgb3B0aW9uID09ICctRic6Ci0gICAgICAgIEZTID0gb3B0YXJnCi0gICAgZWxpZiBvcHRpb24gPT0gJy1uJzoKLSAgICAgICAgTkZMQUcgPSAxCi0gICAgICAgIFBGTEFHID0gMAotICAgIGVsaWYgb3B0aW9uID09ICctcCc6Ci0gICAgICAgIE5GTEFHID0gMQotICAgICAgICBQRkxBRyA9IDEKLSAgICBlbHNlOgotICAgICAgICBwcmludChvcHRpb24sICdub3QgcmVjb2duaXplZD8/PycpCi0KLWlmIG5vdCBBUkdTOiBBUkdTLmFwcGVuZCgnLScpCi0KLWlmIG5vdCBTQ1JJUFQ6Ci0gICAgaWYgQVJHU1swXSA9PSAnLSc6Ci0gICAgICAgIGZwID0gc3lzLnN0ZGluCi0gICAgZWxzZToKLSAgICAgICAgZnAgPSBvcGVuKEFSR1NbMF0sICdyJykKLSAgICB3aGlsZSAxOgotICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQotICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKLSAgICAgICAgU0NSSVBULmFwcGVuZChsaW5lWzotMV0pCi0gICAgZGVsIGZwCi0gICAgZGVsIEFSR1NbMF0KLSAgICBpZiBub3QgQVJHUzogQVJHUy5hcHBlbmQoJy0nKQotCi1pZiBDRkxBRzoKLSAgICBwcm9sb2d1ZSA9IFsnaWYgMDonXQotICAgIGVwaWxvZ3VlID0gW10KLWVsaWYgTkZMQUc6Ci0gICAgIyBOb3RlIHRoYXQgaXQgaXMgb24gcHVycG9zZSB0aGF0IEFGTEFHIGFuZCBQRkxBRyBhcmUKLSAgICAjIHRlc3RlZCBkeW5hbWljYWxseSBlYWNoIHRpbWUgdGhyb3VnaCB0aGUgbG9vcAotICAgIHByb2xvZ3VlID0gWwotICAgICAgICAgICAgJ0xJTkVDT1VOVCA9IDAnLAotICAgICAgICAgICAgJ2ZvciBGSUxFIGluIEFSR1M6JywKLSAgICAgICAgICAgICcgICBcdGlmIEZJTEUgPT0gXCctXCc6JywKLSAgICAgICAgICAgICcgICBcdCAgIFx0RlAgPSBzeXMuc3RkaW4nLAotICAgICAgICAgICAgJyAgIFx0ZWxzZTonLAotICAgICAgICAgICAgJyAgIFx0ICAgXHRGUCA9IG9wZW4oRklMRSwgXCdyXCcpJywKLSAgICAgICAgICAgICcgICBcdExJTkVOTyA9IDAnLAotICAgICAgICAgICAgJyAgIFx0d2hpbGUgMTonLAotICAgICAgICAgICAgJyAgIFx0ICAgXHRMSU5FID0gRlAucmVhZGxpbmUoKScsCi0gICAgICAgICAgICAnICAgXHQgICBcdGlmIG5vdCBMSU5FOiBicmVhaycsCi0gICAgICAgICAgICAnICAgXHQgICBcdExJTkVOTyA9IExJTkVOTyArIDEnLAotICAgICAgICAgICAgJyAgIFx0ICAgXHRMSU5FQ09VTlQgPSBMSU5FQ09VTlQgKyAxJywKLSAgICAgICAgICAgICcgICBcdCAgIFx0TCA9IExJTkVbOi0xXScsCi0gICAgICAgICAgICAnICAgXHQgICBcdGFmbGFnID0gQUZMQUcnLAotICAgICAgICAgICAgJyAgIFx0ICAgXHRpZiBhZmxhZzonLAotICAgICAgICAgICAgJyAgIFx0ICAgXHQgICBcdGlmIEZTOiBGID0gTC5zcGxpdChGUyknLAotICAgICAgICAgICAgJyAgIFx0ICAgXHQgICBcdGVsc2U6IEYgPSBMLnNwbGl0KCknCi0gICAgICAgICAgICBdCi0gICAgZXBpbG9ndWUgPSBbCi0gICAgICAgICAgICAnICAgXHQgICBcdGlmIG5vdCBQRkxBRzogY29udGludWUnLAotICAgICAgICAgICAgJyAgIFx0ICAgXHRpZiBhZmxhZzonLAotICAgICAgICAgICAgJyAgIFx0ICAgXHQgICBcdGlmIEZTOiBwcmludChGUy5qb2luKEYpKScsCi0gICAgICAgICAgICAnICAgXHQgICBcdCAgIFx0ZWxzZTogcHJpbnQoXCcgXCcuam9pbihGKSknLAotICAgICAgICAgICAgJyAgIFx0ICAgXHRlbHNlOiBwcmludChMKScsCi0gICAgICAgICAgICBdCi1lbHNlOgotICAgIHByb2xvZ3VlID0gWydpZiAxOiddCi0gICAgZXBpbG9ndWUgPSBbXQotCi0jIE5vdGUgdGhhdCB3ZSBpbmRlbnQgdXNpbmcgdGFicyBvbmx5LCBzbyB0aGF0IGFueSBpbmRlbnRhdGlvbiBzdHlsZQotIyB1c2VkIGluICdjb21tYW5kJyB3aWxsIGNvbWUgb3V0IHJpZ2h0IGFmdGVyIHJlLWluZGVudGF0aW9uLgotCi1wcm9ncmFtID0gJ1xuJy5qb2luKHByb2xvZ3VlKSArICdcbicKLWZvciBsaW5lIGluIFNDUklQVDoKLSAgICBwcm9ncmFtICs9ICcgICBcdCAgIFx0JyArIGxpbmUgKyAnXG4nCi1wcm9ncmFtICs9ICdcbicuam9pbihlcGlsb2d1ZSkgKyAnXG4nCi0KLWlmIERGTEFHOgotICAgIGltcG9ydCBwZGIKLSAgICBwZGIucnVuKHByb2dyYW0pCi1lbHNlOgotICAgIGV4ZWMocHJvZ3JhbSkKZGlmZiAtLWdpdCBhL0RlbW8vc2NyaXB0cy9wcmltZXMucHkgYi9EZW1vL3NjcmlwdHMvcHJpbWVzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTk0NjIzLi4wMDAwMDAwCi0tLSBhL0RlbW8vc2NyaXB0cy9wcmltZXMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uMwotCi0jIFByaW50IHByaW1lIG51bWJlcnMgaW4gYSBnaXZlbiByYW5nZQotCi1kZWYgcHJpbWVzKG1pbiwgbWF4KToKLSAgICBpZiBtYXggPj0gMiA+PSBtaW46Ci0gICAgICAgIHByaW50KDIpCi0gICAgcHJpbWVzID0gWzJdCi0gICAgaSA9IDMKLSAgICB3aGlsZSBpIDw9IG1heDoKLSAgICAgICAgZm9yIHAgaW4gcHJpbWVzOgotICAgICAgICAgICAgaWYgaSAlIHAgPT0gMCBvciBwKnAgPiBpOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGlmIGkgJSBwICE9IDA6Ci0gICAgICAgICAgICBwcmltZXMuYXBwZW5kKGkpCi0gICAgICAgICAgICBpZiBpID49IG1pbjoKLSAgICAgICAgICAgICAgICBwcmludChpKQotICAgICAgICBpICs9IDIKLQotZGVmIG1haW4oKToKLSAgICBpbXBvcnQgc3lzCi0gICAgbWluLCBtYXggPSAyLCAweDdmZmZmZmZmCi0gICAgaWYgc3lzLmFyZ3ZbMTpdOgotICAgICAgICBtaW4gPSBpbnQoc3lzLmFyZ3ZbMV0pCi0gICAgICAgIGlmIHN5cy5hcmd2WzI6XToKLSAgICAgICAgICAgIG1heCA9IGludChzeXMuYXJndlsyXSkKLSAgICBwcmltZXMobWluLCBtYXgpCi0KLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0RlbW8vc2NyaXB0cy9zY3JpcHQucHkgYi9EZW1vL3NjcmlwdHMvc2NyaXB0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhODE1YTM1Li4wMDAwMDAwCi0tLSBhL0RlbW8vc2NyaXB0cy9zY3JpcHQucHkKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uMwotCi0jIHNjcmlwdC5weSAtLSBNYWtlIHR5cGVzY3JpcHQgb2YgdGVybWluYWwgc2Vzc2lvbi4KLSMgVXNhZ2U6Ci0jICAgICAgIC1hICAgICAgQXBwZW5kIHRvIHR5cGVzY3JpcHQuCi0jICAgICAgIC1wICAgICAgVXNlIFB5dGhvbiBhcyBzaGVsbC4KLSMgQXV0aG9yOiBTdGVlbiBMdW1ob2x0LgotCi0KLWltcG9ydCBvcywgdGltZSwgc3lzLCBnZXRvcHQKLWltcG9ydCBwdHkKLQotZGVmIHJlYWQoZmQpOgotICAgIGRhdGEgPSBvcy5yZWFkKGZkLCAxMDI0KQotICAgIHNjcmlwdC53cml0ZShkYXRhKQotICAgIHJldHVybiBkYXRhCi0KLXNoZWxsID0gJ3NoJwotZmlsZW5hbWUgPSAndHlwZXNjcmlwdCcKLW1vZGUgPSAnd2InCi1pZiAnU0hFTEwnIGluIG9zLmVudmlyb246Ci0gICAgc2hlbGwgPSBvcy5lbnZpcm9uWydTSEVMTCddCi0KLXRyeToKLSAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdhcCcpCi1leGNlcHQgZ2V0b3B0LmVycm9yIGFzIG1zZzoKLSAgICBwcmludCgnJXM6ICVzJyAlIChzeXMuYXJndlswXSwgbXNnKSkKLSAgICBzeXMuZXhpdCgyKQotCi1mb3IgbywgYSBpbiBvcHRzOgotICAgIGlmIG8gPT0gJy1hJzoKLSAgICAgICAgbW9kZSA9ICdhYicKLSAgICBlbGlmIG8gPT0gJy1wJzoKLSAgICAgICAgc2hlbGwgPSAncHl0aG9uJwotCi1zY3JpcHQgPSBvcGVuKGZpbGVuYW1lLCBtb2RlKQotCi1zeXMuc3Rkb3V0LndyaXRlKCdTY3JpcHQgc3RhcnRlZCwgZmlsZSBpcyAlc1xuJyAlIGZpbGVuYW1lKQotc2NyaXB0LndyaXRlKCgnU2NyaXB0IHN0YXJ0ZWQgb24gJXNcbicgJSB0aW1lLmN0aW1lKHRpbWUudGltZSgpKSkuZW5jb2RlKCkpCi1wdHkuc3Bhd24oc2hlbGwsIHJlYWQpCi1zY3JpcHQud3JpdGUoKCdTY3JpcHQgZG9uZSBvbiAlc1xuJyAlIHRpbWUuY3RpbWUodGltZS50aW1lKCkpKS5lbmNvZGUoKSkKLXN5cy5zdGRvdXQud3JpdGUoJ1NjcmlwdCBkb25lLCBmaWxlIGlzICVzXG4nICUgZmlsZW5hbWUpCmRpZmYgLS1naXQgYS9EZW1vL3NjcmlwdHMvdXBkYXRlLnB5IGIvRGVtby9zY3JpcHRzL3VwZGF0ZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDljMDlkOC4uMDAwMDAwMAotLS0gYS9EZW1vL3NjcmlwdHMvdXBkYXRlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbjMKLQotIyBVcGRhdGUgYSBidW5jaCBvZiBmaWxlcyBhY2NvcmRpbmcgdG8gYSBzY3JpcHQuCi0jIFRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIGxpbmVzIG9mIHRoZSBmb3JtIDxmaWxlbmFtZT46PGxpbmVubz46PHRleHQ+LAotIyBtZWFuaW5nIHRoYXQgdGhlIGdpdmVuIGxpbmUgb2YgdGhlIGdpdmVuIGZpbGUgaXMgdG8gYmUgcmVwbGFjZWQKLSMgYnkgdGhlIGdpdmVuIHRleHQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgcGVyZm9ybWluZyBnbG9iYWwgc3Vic3RpdHV0aW9ucwotIyBvbiBncmVwIG91dHB1dDoKLQotaW1wb3J0IG9zCi1pbXBvcnQgc3lzCi1pbXBvcnQgcmUKLQotcGF0ID0gJ14oW146IFx0XG5dKyk6KFsxLTldWzAtOV0qKTonCi1wcm9nID0gcmUuY29tcGlsZShwYXQpCi0KLWNsYXNzIEZpbGVPYmo6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lKToKLSAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCi0gICAgICAgIHNlbGYuY2hhbmdlZCA9IDAKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5saW5lcyA9IG9wZW4oZmlsZW5hbWUsICdyJykucmVhZGxpbmVzKCkKLSAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgbXNnOgotICAgICAgICAgICAgcHJpbnQoJyoqKiBDYW5cJ3Qgb3BlbiAiJXMiOicgJSBmaWxlbmFtZSwgbXNnKQotICAgICAgICAgICAgc2VsZi5saW5lcyA9IE5vbmUKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBwcmludCgnZGlmZmluZycsIHNlbGYuZmlsZW5hbWUpCi0KLSAgICBkZWYgZmluaXNoKHNlbGYpOgotICAgICAgICBpZiBub3Qgc2VsZi5jaGFuZ2VkOgotICAgICAgICAgICAgcHJpbnQoJ25vIGNoYW5nZXMgdG8nLCBzZWxmLmZpbGVuYW1lKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG9zLnJlbmFtZShzZWxmLmZpbGVuYW1lLCBzZWxmLmZpbGVuYW1lICsgJ34nKQotICAgICAgICAgICAgZnAgPSBvcGVuKHNlbGYuZmlsZW5hbWUsICd3JykKLSAgICAgICAgZXhjZXB0IChvcy5lcnJvciwgSU9FcnJvcikgYXMgbXNnOgotICAgICAgICAgICAgcHJpbnQoJyoqKiBDYW5cJ3QgcmV3cml0ZSAiJXMiOicgJSBzZWxmLmZpbGVuYW1lLCBtc2cpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgcHJpbnQoJ3dyaXRpbmcnLCBzZWxmLmZpbGVuYW1lKQotICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmxpbmVzOgotICAgICAgICAgICAgZnAud3JpdGUobGluZSkKLSAgICAgICAgZnAuY2xvc2UoKQotICAgICAgICBzZWxmLmNoYW5nZWQgPSAwCi0KLSAgICBkZWYgcHJvY2VzcyhzZWxmLCBsaW5lbm8sIHJlc3QpOgotICAgICAgICBpZiBzZWxmLmxpbmVzIGlzIE5vbmU6Ci0gICAgICAgICAgICBwcmludCgnKG5vdCBwcm9jZXNzZWQpOiAlczolczolcycgJSAoCi0gICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbmFtZSwgbGluZW5vLCByZXN0KSwgZW5kPScgJykKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpID0gZXZhbChsaW5lbm8pIC0gMQotICAgICAgICBpZiBub3QgMCA8PSBpIDwgbGVuKHNlbGYubGluZXMpOgotICAgICAgICAgICAgcHJpbnQoJyoqKiBMaW5lIG51bWJlciBvdXQgb2YgcmFuZ2U6ICVzOiVzOiVzJyAlICgKLSAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVuYW1lLCBsaW5lbm8sIHJlc3QpLCBlbmQ9JyAnKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIHNlbGYubGluZXNbaV0gPT0gcmVzdDoKLSAgICAgICAgICAgIHByaW50KCcobm8gY2hhbmdlKTogJXM6JXM6JXMnICUgKAotICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUsIGxpbmVubywgcmVzdCksIGVuZD0nICcpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaWYgbm90IHNlbGYuY2hhbmdlZDoKLSAgICAgICAgICAgIHNlbGYuY2hhbmdlZCA9IDEKLSAgICAgICAgcHJpbnQoJyVzYyVzJyAlIChsaW5lbm8sIGxpbmVubykpCi0gICAgICAgIHByaW50KCc8Jywgc2VsZi5saW5lc1tpXSwgZW5kPScgJykKLSAgICAgICAgcHJpbnQoJy0tLScpCi0gICAgICAgIHNlbGYubGluZXNbaV0gPSByZXN0Ci0gICAgICAgIHByaW50KCc+Jywgc2VsZi5saW5lc1tpXSwgZW5kPScgJykKLQotZGVmIG1haW4oKToKLSAgICBpZiBzeXMuYXJndlsxOl06Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZwID0gb3BlbihzeXMuYXJndlsxXSwgJ3InKQotICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBtc2c6Ci0gICAgICAgICAgICBwcmludCgnQ2FuXCd0IG9wZW4gIiVzIjonICUgc3lzLmFyZ3ZbMV0sIG1zZykKLSAgICAgICAgICAgIHN5cy5leGl0KDEpCi0gICAgZWxzZToKLSAgICAgICAgZnAgPSBzeXMuc3RkaW4KLSAgICBjdXJmaWxlID0gTm9uZQotICAgIHdoaWxlIDE6Ci0gICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCi0gICAgICAgIGlmIG5vdCBsaW5lOgotICAgICAgICAgICAgaWYgY3VyZmlsZTogY3VyZmlsZS5maW5pc2goKQotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgbiA9IHByb2cubWF0Y2gobGluZSkKLSAgICAgICAgaWYgbiA8IDA6Ci0gICAgICAgICAgICBwcmludCgnRnVubnkgbGluZTonLCBsaW5lLCBlbmQ9JyAnKQotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZmlsZW5hbWUsIGxpbmVubyA9IHByb2cuZ3JvdXAoMSwgMikKLSAgICAgICAgaWYgbm90IGN1cmZpbGUgb3IgZmlsZW5hbWUgIT0gY3VyZmlsZS5maWxlbmFtZToKLSAgICAgICAgICAgIGlmIGN1cmZpbGU6IGN1cmZpbGUuZmluaXNoKCkKLSAgICAgICAgICAgIGN1cmZpbGUgPSBGaWxlT2JqKGZpbGVuYW1lKQotICAgICAgICBjdXJmaWxlLnByb2Nlc3MobGluZW5vLCBsaW5lW246XSkKLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0RlbW8vdGhyZWFkcy9Db3JvdXRpbmUucHkgYi9EZW1vL3RocmVhZHMvQ29yb3V0aW5lLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTBmYWRjLi4wMDAwMDAwCi0tLSBhL0RlbW8vdGhyZWFkcy9Db3JvdXRpbmUucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotIyBDb3JvdXRpbmUgaW1wbGVtZW50YXRpb24gdXNpbmcgUHl0aG9uIHRocmVhZHMuCi0jCi0jIENvbWJpbmVzIGlkZWFzIGZyb20gR3VpZG8ncyBHZW5lcmF0b3IgbW9kdWxlLCBhbmQgZnJvbSB0aGUgY29yb3V0aW5lCi0jIGZlYXR1cmVzIG9mIEljb24gYW5kIFNpbXVsYSA2Ny4KLSMKLSMgVG8gcnVuIGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMgYXMgY29yb3V0aW5lcywgeW91IG5lZWQgdG8gY3JlYXRlCi0jIGEgQ29yb3V0aW5lIG9iamVjdCB0byBjb250cm9sIHRoZW06Ci0jICAgIGNvID0gQ29yb3V0aW5lKCkKLSMgYW5kIHRoZW4gJ2NyZWF0ZScgYSBzdWJzaWRpYXJ5IG9iamVjdCBmb3IgZWFjaCBmdW5jdGlvbiBpbiB0aGUKLSMgY29sbGVjdGlvbjoKLSMgICAgY29mMSA9IGNvLmNyZWF0ZShmMSBbLCBhcmcxLCBhcmcyLCAuLi5dKSAjIFtdIG1lYW5zIG9wdGlvbmFsLAotIyAgICBjb2YyID0gY28uY3JlYXRlKGYyIFssIGFyZzEsIGFyZzIsIC4uLl0pICMuLi4gbm90IGxpc3QKLSMgICAgY29mMyA9IGNvLmNyZWF0ZShmMyBbLCBhcmcxLCBhcmcyLCAuLi5dKQotIyBldGMuICBUaGUgZnVuY3Rpb25zIG5lZWQgbm90IGJlIGRpc3RpbmN0OyAnY3JlYXRlJ2luZyB0aGUgc2FtZQotIyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcyBnaXZlcyB5b3UgaW5kZXBlbmRlbnQgaW5zdGFuY2VzIG9mIHRoZQotIyBmdW5jdGlvbi4KLSMKLSMgVG8gc3RhcnQgdGhlIGNvcm91dGluZXMgcnVubmluZywgdXNlIGNvLnRyYW4gb24gb25lIG9mIHRoZSBjcmVhdGUnZAotIyBmdW5jdGlvbnM7IGUuZy4sIGNvLnRyYW4oY29mMikuICBUaGUgcm91dGluZSB0aGF0IGZpcnN0IGV4ZWN1dGVzCi0jIGNvLnRyYW4gaXMgY2FsbGVkIHRoZSAibWFpbiBjb3JvdXRpbmUiLiAgSXQncyBzcGVjaWFsIGluIHNldmVyYWwKLSMgcmVzcGVjdHM6ICBpdCBleGlzdGVkIGJlZm9yZSB5b3UgY3JlYXRlZCB0aGUgQ29yb3V0aW5lIG9iamVjdDsgaWYgYW55IG9mCi0jIHRoZSBjcmVhdGUnZCBjb3JvdXRpbmVzIGV4aXRzIChkb2VzIGEgcmV0dXJuLCBvciBzdWZmZXJzIGFuIHVuaGFuZGxlZAotIyBleGNlcHRpb24pLCBFYXJseUV4aXQgZXJyb3IgaXMgcmFpc2VkIGluIHRoZSBtYWluIGNvcm91dGluZTsgYW5kIHRoZQotIyBjby5kZXRhY2goKSBtZXRob2QgdHJhbnNmZXJzIGNvbnRyb2wgZGlyZWN0bHkgdG8gdGhlIG1haW4gY29yb3V0aW5lCi0jICh5b3UgY2FuJ3QgdXNlIGNvLnRyYW4oKSBmb3IgdGhpcyBiZWNhdXNlIHRoZSBtYWluIGNvcm91dGluZSBkb2Vzbid0Ci0jIGhhdmUgYSBuYW1lIC4uLikuCi0jCi0jIENvcm91dGluZSBvYmplY3RzIHN1cHBvcnQgdGhlc2UgbWV0aG9kczoKLSMKLSMgaGFuZGxlID0gLmNyZWF0ZShmdW5jIFssIGFyZzEsIGFyZzIsIC4uLl0pCi0jICAgIENyZWF0ZXMgYSBjb3JvdXRpbmUgZm9yIGFuIGludm9jYXRpb24gb2YgZnVuYyhhcmcxLCBhcmcyLCAuLi4pLAotIyAgICBhbmQgcmV0dXJucyBhIGhhbmRsZSAoIm5hbWUiKSBmb3IgdGhlIGNvcm91dGluZSBzbyBjcmVhdGVkLiAgVGhlCi0jICAgIGhhbmRsZSBjYW4gYmUgdXNlZCBhcyB0aGUgdGFyZ2V0IGluIGEgc3Vic2VxdWVudCAudHJhbigpLgotIwotIyAudHJhbih0YXJnZXQsIGRhdGE9Tm9uZSkKLSMgICAgVHJhbnNmZXIgY29udHJvbCB0byB0aGUgY3JlYXRlJ2QgY29yb3V0aW5lICJ0YXJnZXQiLCBvcHRpb25hbGx5Ci0jICAgIHBhc3NpbmcgaXQgYW4gYXJiaXRyYXJ5IHBpZWNlIG9mIGRhdGEuIFRvIHRoZSBjb3JvdXRpbmUgQSB0aGF0IGRvZXMKLSMgICAgdGhlIC50cmFuLCAudHJhbiBhY3RzIGxpa2UgYW4gb3JkaW5hcnkgZnVuY3Rpb24gY2FsbDogIGFub3RoZXIKLSMgICAgY29yb3V0aW5lIEIgY2FuIC50cmFuIGJhY2sgdG8gaXQgbGF0ZXIsIGFuZCBpZiBpdCBkb2VzIEEncyAudHJhbgotIyAgICByZXR1cm5zIHRoZSAnZGF0YScgYXJndW1lbnQgcGFzc2VkIHRvIEIncyB0cmFuLiAgRS5nLiwKLSMKLSMgICAgaW4gY29yb3V0aW5lIGNvQSAgIGluIGNvcm91dGluZSBjb0MgICAgaW4gY29yb3V0aW5lIGNvQgotIyAgICAgIHggPSBjby50cmFuKGNvQykgICBjby50cmFuKGNvQikgICAgICAgIGNvLnRyYW4oY29BLDEyKQotIyAgICAgIHByaW50IHggIyAxMgotIwotIyAgICBUaGUgZGF0YS1wYXNzaW5nIGZlYXR1cmUgaXMgdGFrZW4gZnJvbSBJY29uLCBhbmQgZ3JlYXRseSBjdXRzCi0jICAgIHRoZSBuZWVkIHRvIHVzZSBnbG9iYWwgdmFyaWFibGVzIGZvciBpbnRlci1jb3JvdXRpbmUgY29tbXVuaWNhdGlvbi4KLSMKLSMgLmJhY2soIGRhdGE9Tm9uZSApCi0jICAgIFRoZSBzYW1lIGFzIC50cmFuKGludm9rZXIsIGRhdGE9Tm9uZSksIHdoZXJlICdpbnZva2VyJyBpcyB0aGUKLSMgICAgY29yb3V0aW5lIHRoYXQgbW9zdCByZWNlbnRseSAudHJhbidlZCBjb250cm9sIHRvIHRoZSBjb3JvdXRpbmUKLSMgICAgZG9pbmcgdGhlIC5iYWNrLiAgVGhpcyBpcyBha2luIHRvIEljb24ncyAiJnNvdXJjZSIuCi0jCi0jIC5kZXRhY2goIGRhdGE9Tm9uZSApCi0jICAgIFRoZSBzYW1lIGFzIC50cmFuKG1haW4sIGRhdGE9Tm9uZSksIHdoZXJlICdtYWluJyBpcyB0aGUKLSMgICAgKHVubmFtZWFibGUhKSBjb3JvdXRpbmUgdGhhdCBzdGFydGVkIGl0IGFsbC4gICdtYWluJyBoYXMgYWxsIHRoZQotIyAgICByaWdodHMgb2YgYW55IG90aGVyIGNvcm91dGluZTogIHVwb24gcmVjZWl2aW5nIGNvbnRyb2wsIGl0IGNhbgotIyAgICAudHJhbiB0byBhbiBhcmJpdHJhcnkgY29yb3V0aW5lIG9mIGl0cyBjaG9vc2luZywgZ28gLmJhY2sgdG8KLSMgICAgdGhlIC5kZXRhY2gnZXIsIG9yIC5raWxsIHRoZSB3aG9sZSB0aGluZy4KLSMKLSMgLmtpbGwoKQotIyAgICBEZXN0cm95IGFsbCB0aGUgY29yb3V0aW5lcywgYW5kIHJldHVybiBjb250cm9sIHRvIHRoZSBtYWluCi0jICAgIGNvcm91dGluZS4gIE5vbmUgb2YgdGhlIGNyZWF0ZSdlZCBjb3JvdXRpbmVzIGNhbiBiZSByZXN1bWVkIGFmdGVyIGEKLSMgICAgLmtpbGwoKS4gIEFuIEVhcmx5RXhpdCBleGNlcHRpb24gZG9lcyBhIC5raWxsKCkgYXV0b21hdGljYWxseS4gIEl0J3MKLSMgICAgYSBnb29kIGlkZWEgdG8gLmtpbGwoKSBjb3JvdXRpbmVzIHlvdSdyZSBkb25lIHdpdGgsIHNpbmNlIHRoZQotIyAgICBjdXJyZW50IGltcGxlbWVudGF0aW9uIGNvbnN1bWVzIGEgdGhyZWFkIGZvciBlYWNoIGNvcm91dGluZSB0aGF0Ci0jICAgIG1heSBiZSByZXN1bWVkLgotCi1pbXBvcnQgX3RocmVhZCBhcyB0aHJlYWQKLWltcG9ydCBzeW5jCi0KLWNsYXNzIF9Db0V2ZW50OgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jKToKLSAgICAgICAgc2VsZi5mID0gZnVuYwotICAgICAgICBzZWxmLmUgPSBzeW5jLmV2ZW50KCkKLQotICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgaWYgc2VsZi5mIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gJ21haW4gY29yb3V0aW5lJwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuICdjb3JvdXRpbmUgZm9yIGZ1bmMgJyArIHNlbGYuZi5fX25hbWVfXwotCi0gICAgZGVmIF9faGFzaF9fKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQoc2VsZikKLQotICAgIGRlZiBfX2NtcF9fKHgseSk6Ci0gICAgICAgIHJldHVybiBjbXAoaWQoeCksIGlkKHkpKQotCi0gICAgZGVmIHJlc3VtZShzZWxmKToKLSAgICAgICAgc2VsZi5lLnBvc3QoKQotCi0gICAgZGVmIHdhaXQoc2VsZik6Ci0gICAgICAgIHNlbGYuZS53YWl0KCkKLSAgICAgICAgc2VsZi5lLmNsZWFyKCkKLQotY2xhc3MgS2lsbGVkKEV4Y2VwdGlvbik6IHBhc3MKLWNsYXNzIEVhcmx5RXhpdChFeGNlcHRpb24pOiBwYXNzCi0KLWNsYXNzIENvcm91dGluZToKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuYWN0aXZlID0gc2VsZi5tYWluID0gX0NvRXZlbnQoTm9uZSkKLSAgICAgICAgc2VsZi5pbnZva2VkYnkgPSB7c2VsZi5tYWluOiBOb25lfQotICAgICAgICBzZWxmLmtpbGxlZCA9IDAKLSAgICAgICAgc2VsZi52YWx1ZSAgPSBOb25lCi0gICAgICAgIHNlbGYudGVybWluYXRlZF9ieSA9IE5vbmUKLQotICAgIGRlZiBjcmVhdGUoc2VsZiwgZnVuYywgKmFyZ3MpOgotICAgICAgICBtZSA9IF9Db0V2ZW50KGZ1bmMpCi0gICAgICAgIHNlbGYuaW52b2tlZGJ5W21lXSA9IE5vbmUKLSAgICAgICAgdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoc2VsZi5fc3RhcnQsIChtZSwpICsgYXJncykKLSAgICAgICAgcmV0dXJuIG1lCi0KLSAgICBkZWYgX3N0YXJ0KHNlbGYsIG1lLCAqYXJncyk6Ci0gICAgICAgIG1lLndhaXQoKQotICAgICAgICBpZiBub3Qgc2VsZi5raWxsZWQ6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBtZS5mKCphcmdzKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBLaWxsZWQ6Ci0gICAgICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgaWYgbm90IHNlbGYua2lsbGVkOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnRlcm1pbmF0ZWRfYnkgPSBtZQotICAgICAgICAgICAgICAgICAgICBzZWxmLmtpbGwoKQotCi0gICAgZGVmIGtpbGwoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYua2lsbGVkOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdraWxsKCkgY2FsbGVkIG9uIGRlYWQgY29yb3V0aW5lcycpCi0gICAgICAgIHNlbGYua2lsbGVkID0gMQotICAgICAgICBmb3IgY29yb3V0aW5lIGluIHNlbGYuaW52b2tlZGJ5LmtleXMoKToKLSAgICAgICAgICAgIGNvcm91dGluZS5yZXN1bWUoKQotCi0gICAgZGVmIGJhY2soc2VsZiwgZGF0YT1Ob25lKToKLSAgICAgICAgcmV0dXJuIHNlbGYudHJhbiggc2VsZi5pbnZva2VkYnlbc2VsZi5hY3RpdmVdLCBkYXRhICkKLQotICAgIGRlZiBkZXRhY2goc2VsZiwgZGF0YT1Ob25lKToKLSAgICAgICAgcmV0dXJuIHNlbGYudHJhbiggc2VsZi5tYWluLCBkYXRhICkKLQotICAgIGRlZiB0cmFuKHNlbGYsIHRhcmdldCwgZGF0YT1Ob25lKToKLSAgICAgICAgaWYgdGFyZ2V0IG5vdCBpbiBzZWxmLmludm9rZWRieToKLSAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignLnRyYW4gdGFyZ2V0ICVyIGlzIG5vdCBhbiBhY3RpdmUgY29yb3V0aW5lJyAlICh0YXJnZXQsKSkKLSAgICAgICAgaWYgc2VsZi5raWxsZWQ6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJy50cmFuIHRhcmdldCAlciBpcyBraWxsZWQnICUgKHRhcmdldCwpKQotICAgICAgICBzZWxmLnZhbHVlID0gZGF0YQotICAgICAgICBtZSA9IHNlbGYuYWN0aXZlCi0gICAgICAgIHNlbGYuaW52b2tlZGJ5W3RhcmdldF0gPSBtZQotICAgICAgICBzZWxmLmFjdGl2ZSA9IHRhcmdldAotICAgICAgICB0YXJnZXQucmVzdW1lKCkKLQotICAgICAgICBtZS53YWl0KCkKLSAgICAgICAgaWYgc2VsZi5raWxsZWQ6Ci0gICAgICAgICAgICBpZiBzZWxmLm1haW4gaXMgbm90IG1lOgotICAgICAgICAgICAgICAgIHJhaXNlIEtpbGxlZAotICAgICAgICAgICAgaWYgc2VsZi50ZXJtaW5hdGVkX2J5IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHJhaXNlIEVhcmx5RXhpdCgnJXIgdGVybWluYXRlZCBlYXJseScgJSAoc2VsZi50ZXJtaW5hdGVkX2J5LCkpCi0KLSAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKLQotIyBlbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9EZW1vL3RocmVhZHMvR2VuZXJhdG9yLnB5IGIvRGVtby90aHJlYWRzL0dlbmVyYXRvci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EyOTYzZi4uMDAwMDAwMAotLS0gYS9EZW1vL3RocmVhZHMvR2VuZXJhdG9yLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotIyBHZW5lcmF0b3IgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhyZWFkcwotCi1pbXBvcnQgX3RocmVhZCBhcyB0aHJlYWQKLWltcG9ydCBzeXMKLQotY2xhc3MgS2lsbGVkKEV4Y2VwdGlvbik6Ci0gICAgcGFzcwotCi1jbGFzcyBHZW5lcmF0b3I6Ci0gICAgIyBDb25zdHJ1Y3RvcgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jLCBhcmdzKToKLSAgICAgICAgc2VsZi5nZXRsb2NrID0gdGhyZWFkLmFsbG9jYXRlX2xvY2soKQotICAgICAgICBzZWxmLnB1dGxvY2sgPSB0aHJlYWQuYWxsb2NhdGVfbG9jaygpCi0gICAgICAgIHNlbGYuZ2V0bG9jay5hY3F1aXJlKCkKLSAgICAgICAgc2VsZi5wdXRsb2NrLmFjcXVpcmUoKQotICAgICAgICBzZWxmLmZ1bmMgPSBmdW5jCi0gICAgICAgIHNlbGYuYXJncyA9IGFyZ3MKLSAgICAgICAgc2VsZi5kb25lID0gMAotICAgICAgICBzZWxmLmtpbGxlZCA9IDAKLSAgICAgICAgdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoc2VsZi5fc3RhcnQsICgpKQotCi0gICAgIyBJbnRlcm5hbCByb3V0aW5lCi0gICAgZGVmIF9zdGFydChzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5wdXRsb2NrLmFjcXVpcmUoKQotICAgICAgICAgICAgaWYgbm90IHNlbGYua2lsbGVkOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mdW5jKHNlbGYsICpzZWxmLmFyZ3MpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEtpbGxlZDoKLSAgICAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgaWYgbm90IHNlbGYua2lsbGVkOgotICAgICAgICAgICAgICAgIHNlbGYuZG9uZSA9IDEKLSAgICAgICAgICAgICAgICBzZWxmLmdldGxvY2sucmVsZWFzZSgpCi0KLSAgICAjIENhbGxlZCBieSBwcm9kdWNlciBmb3IgZWFjaCB2YWx1ZTsgcmFpc2UgS2lsbGVkIGlmIG5vIG1vcmUgbmVlZGVkCi0gICAgZGVmIHB1dChzZWxmLCB2YWx1ZSk6Ci0gICAgICAgIGlmIHNlbGYua2lsbGVkOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdwdXQoKSBjYWxsZWQgb24ga2lsbGVkIGdlbmVyYXRvcicpCi0gICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQotICAgICAgICBzZWxmLmdldGxvY2sucmVsZWFzZSgpICAjIFJlc3VtZSBjb25zdW1lciB0aHJlYWQKLSAgICAgICAgc2VsZi5wdXRsb2NrLmFjcXVpcmUoKSAgIyBXYWl0IGZvciBuZXh0IGdldCgpIGNhbGwKLSAgICAgICAgaWYgc2VsZi5raWxsZWQ6Ci0gICAgICAgICAgICByYWlzZSBLaWxsZWQKLQotICAgICMgQ2FsbGVkIGJ5IHByb2R1Y2VyIHRvIGdldCBuZXh0IHZhbHVlOyByYWlzZSBFT0ZFcnJvciBpZiBubyBtb3JlCi0gICAgZGVmIGdldChzZWxmKToKLSAgICAgICAgaWYgc2VsZi5raWxsZWQ6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2dldCgpIGNhbGxlZCBvbiBraWxsZWQgZ2VuZXJhdG9yJykKLSAgICAgICAgc2VsZi5wdXRsb2NrLnJlbGVhc2UoKSAgIyBSZXN1bWUgcHJvZHVjZXIgdGhyZWFkCi0gICAgICAgIHNlbGYuZ2V0bG9jay5hY3F1aXJlKCkgICMgV2FpdCBmb3IgdmFsdWUgdG8gYXBwZWFyCi0gICAgICAgIGlmIHNlbGYuZG9uZToKLSAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yICAjIFNheSB0aGVyZSBhcmUgbm8gbW9yZSB2YWx1ZXMKLSAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKLQotICAgICMgQ2FsbGVkIGJ5IGNvbnN1bWVyIGlmIG5vIG1vcmUgdmFsdWVzIHdhbnRlZAotICAgIGRlZiBraWxsKHNlbGYpOgotICAgICAgICBpZiBzZWxmLmtpbGxlZDoKLSAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigna2lsbCgpIGNhbGxlZCBvbiBraWxsZWQgZ2VuZXJhdG9yJykKLSAgICAgICAgc2VsZi5raWxsZWQgPSAxCi0gICAgICAgIHNlbGYucHV0bG9jay5yZWxlYXNlKCkKLQotICAgICMgQ2xvbmUgY29uc3RydWN0b3IKLSAgICBkZWYgY2xvbmUoc2VsZik6Ci0gICAgICAgIHJldHVybiBHZW5lcmF0b3Ioc2VsZi5mdW5jLCBzZWxmLmFyZ3MpCi0KLWRlZiBwaShnKToKLSAgICBrLCBhLCBiLCBhMSwgYjEgPSAyLCA0LCAxLCAxMiwgNAotICAgIHdoaWxlIDE6Ci0gICAgICAgICMgTmV4dCBhcHByb3hpbWF0aW9uCi0gICAgICAgIHAsIHEsIGsgPSBrKmssIDIqaysxLCBrKzEKLSAgICAgICAgYSwgYiwgYTEsIGIxID0gYTEsIGIxLCBwKmErcSphMSwgcCpiK3EqYjEKLSAgICAgICAgIyBQcmludCBjb21tb24gZGlnaXRzCi0gICAgICAgIGQsIGQxID0gYS8vYiwgYTEvL2IxCi0gICAgICAgIHdoaWxlIGQgPT0gZDE6Ci0gICAgICAgICAgICBnLnB1dChpbnQoZCkpCi0gICAgICAgICAgICBhLCBhMSA9IDEwKihhJWIpLCAxMCooYTElYjEpCi0gICAgICAgICAgICBkLCBkMSA9IGEvL2IsIGExLy9iMQotCi1kZWYgdGVzdCgpOgotICAgIGcgPSBHZW5lcmF0b3IocGksICgpKQotICAgIGcua2lsbCgpCi0gICAgZyA9IEdlbmVyYXRvcihwaSwgKCkpCi0gICAgZm9yIGkgaW4gcmFuZ2UoMTApOiBwcmludChnLmdldCgpLCBlbmQ9JyAnKQotICAgIHByaW50KCkKLSAgICBoID0gZy5jbG9uZSgpCi0gICAgZy5raWxsKCkKLSAgICB3aGlsZSAxOgotICAgICAgICBwcmludChoLmdldCgpLCBlbmQ9JyAnKQotICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKLQotdGVzdCgpCmRpZmYgLS1naXQgYS9EZW1vL3RocmVhZHMvUkVBRE1FIGIvRGVtby90aHJlYWRzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM3OTUyMS4uMDAwMDAwMAotLS0gYS9EZW1vL3RocmVhZHMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgc29tZSBkZW1vbnN0cmF0aW9ucyBvZiB0aGUgdGhyZWFkIG1vZHVsZS4KLQotVGhlc2UgYXJlIG1vc3RseSAicHJvb2Ygb2YgY29uY2VwdCIgdHlwZSBhcHBsaWNhdGlvbnM6Ci0KLUdlbmVyYXRvci5weQlHZW5lcmF0b3IgY2xhc3MgaW1wbGVtZW50ZWQgd2l0aCB0aHJlYWRzLgotc3luYy5weQkJQ29uZGl0aW9uIHZhcmlhYmxlcyBwcmltaXRpdmVzIGJ5IFRpbSBQZXRlcnMuCi10ZWxuZXQucHkJVmVyc2lvbiBvZiAuLi9zb2NrZXRzL3RlbG5ldC5weSB1c2luZyB0aHJlYWRzLgotCi1Db3JvdXRpbmUucHkJQ29yb3V0aW5lcyB1c2luZyB0aHJlYWRzLCBieSBUaW0gUGV0ZXJzICgyMiBNYXkgOTQpCi1mY21wLnB5CQlFeGFtcGxlIG9mIGFib3ZlLCBieSBUaW0KLXNxdWFzaGVyLnB5CUFub3RoZXIgZXhhbXBsZSBvZiBhYm92ZSwgYWxzbyBieSBUaW0KZGlmZiAtLWdpdCBhL0RlbW8vdGhyZWFkcy9mY21wLnB5IGIvRGVtby90aHJlYWRzL2ZjbXAucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMmUzZWQuLjAwMDAwMDAKLS0tIGEvRGVtby90aHJlYWRzL2ZjbXAucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0jIENvcm91dGluZSBleGFtcGxlOiAgY29udHJvbGxpbmcgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIGEgc2luZ2xlIGZ1bmN0aW9uCi0KLWZyb20gQ29yb3V0aW5lIGltcG9ydCAqCi0KLSMgZnJpbmdlIHZpc2l0cyBhIG5lc3RlZCBsaXN0IGluIGlub3JkZXIsIGFuZCBkZXRhY2hlcyBmb3IgZWFjaCBub24tbGlzdAotIyBlbGVtZW50OyByYWlzZXMgRWFybHlFeGl0IGFmdGVyIHRoZSBsaXN0IGlzIGV4aGF1c3RlZAotZGVmIGZyaW5nZShjbywgbGlzdCk6Ci0gICAgZm9yIHggaW4gbGlzdDoKLSAgICAgICAgaWYgdHlwZSh4KSBpcyB0eXBlKFtdKToKLSAgICAgICAgICAgIGZyaW5nZShjbywgeCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGNvLmJhY2soeCkKLQotZGVmIHByaW50aW5vcmRlcihsaXN0KToKLSAgICBjbyA9IENvcm91dGluZSgpCi0gICAgZiA9IGNvLmNyZWF0ZShmcmluZ2UsIGNvLCBsaXN0KQotICAgIHRyeToKLSAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIHByaW50KGNvLnRyYW4oZiksIGVuZD0nICcpCi0gICAgZXhjZXB0IEVhcmx5RXhpdDoKLSAgICAgICAgcGFzcwotICAgIHByaW50KCkKLQotcHJpbnRpbm9yZGVyKFsxLDIsM10pICAjIDEgMiAzCi1wcmludGlub3JkZXIoW1tbWzEsWzJdXV0sM11dKSAjIGRpdHRvCi14ID0gWzAsIDEsIFsyLCBbM11dLCBbNCw1XSwgW1tbNl1dXSBdCi1wcmludGlub3JkZXIoeCkgIyAwIDEgMiAzIDQgNSA2Ci0KLSMgZmNtcCBsZXhpY29ncmFwaGljYWxseSBjb21wYXJlcyB0aGUgZnJpbmdlcyBvZiB0d28gbmVzdGVkIGxpc3RzCi1kZWYgZmNtcChsMSwgbDIpOgotICAgIGNvMSA9IENvcm91dGluZSgpOyBmMSA9IGNvMS5jcmVhdGUoZnJpbmdlLCBjbzEsIGwxKQotICAgIGNvMiA9IENvcm91dGluZSgpOyBmMiA9IGNvMi5jcmVhdGUoZnJpbmdlLCBjbzIsIGwyKQotICAgIHdoaWxlIDE6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHYxID0gY28xLnRyYW4oZjEpCi0gICAgICAgIGV4Y2VwdCBFYXJseUV4aXQ6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgdjIgPSBjbzIudHJhbihmMikKLSAgICAgICAgICAgIGV4Y2VwdCBFYXJseUV4aXQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAKLSAgICAgICAgICAgIGNvMi5raWxsKCkKLSAgICAgICAgICAgIHJldHVybiAtMQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB2MiA9IGNvMi50cmFuKGYyKQotICAgICAgICBleGNlcHQgRWFybHlFeGl0OgotICAgICAgICAgICAgY28xLmtpbGwoKQotICAgICAgICAgICAgcmV0dXJuIDEKLSAgICAgICAgaWYgdjEgIT0gdjI6Ci0gICAgICAgICAgICBjbzEua2lsbCgpOyBjbzIua2lsbCgpCi0gICAgICAgICAgICByZXR1cm4gY21wKHYxLHYyKQotCi1wcmludChmY21wKHJhbmdlKDcpLCB4KSkgICMgIDA7IGZyaW5nZXMgYXJlIGVxdWFsCi1wcmludChmY21wKHJhbmdlKDYpLCB4KSkgICMgLTE7IDFzdCBsaXN0IGVuZHMgZWFybHkKLXByaW50KGZjbXAoeCwgcmFuZ2UoNikpKSAgIyAgMTsgMm5kIGxpc3QgZW5kcyBlYXJseQotcHJpbnQoZmNtcChyYW5nZSg4KSwgeCkpICAjICAxOyAybmQgbGlzdCBlbmRzIGVhcmx5Ci1wcmludChmY21wKHgsIHJhbmdlKDgpKSkgICMgLTE7IDFzdCBsaXN0IGVuZHMgZWFybHkKLXByaW50KGZjbXAoWzEsW1syXSw4XV0sCi0gICAgICAgICAgIFtbWzFdLDJdLDhdKSkgICMgIDAKLXByaW50KGZjbXAoWzEsW1szXSw4XV0sCi0gICAgICAgICAgIFtbWzFdLDJdLDhdKSkgICMgIDEKLXByaW50KGZjbXAoWzEsW1syXSw4XV0sCi0gICAgICAgICAgIFtbWzFdLDJdLDldKSkgICMgLTEKLQotIyBlbmQgb2YgZXhhbXBsZQpkaWZmIC0tZ2l0IGEvRGVtby90aHJlYWRzL2ZpbmQucHkgYi9EZW1vL3RocmVhZHMvZmluZC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0ZWY3ZC4uMDAwMDAwMAotLS0gYS9EZW1vL3RocmVhZHMvZmluZC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0jIEEgcGFyYWxsZWxpemVkICJmaW5kKDEpIiB1c2luZyB0aGUgdGhyZWFkIG1vZHVsZS4KLQotIyBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIGEgd29yayBxdWV1ZSBhbmQgd29ya2VyIHRocmVhZHMuCi0jIEl0IHJlYWxseSBkb2VzIGRvIG1vcmUgc3RhdHMvc2VjIHdoZW4gdXNpbmcgbXVsdGlwbGUgdGhyZWFkcywKLSMgYWx0aG91Z2ggdGhlIGltcHJvdmVtZW50IGlzIG9ubHkgYWJvdXQgMjAtMzAgcGVyY2VudC4KLSMgKFRoYXQgd2FzIDggeWVhcnMgYWdvLiAgSW4gMjAwMiwgb24gTGludXgsIEkgY2FuJ3QgbWVhc3VyZQotIyBhIHNwZWVkdXAuIDotKCApCi0KLSMgSSdtIHRvbyBsYXp5IHRvIHdyaXRlIGEgY29tbWFuZCBsaW5lIHBhcnNlciBmb3IgdGhlIGZ1bGwgZmluZCgxKQotIyBjb21tYW5kIGxpbmUgc3ludGF4LCBzbyB0aGUgcHJlZGljYXRlIGl0IHNlYXJjaGVzIGZvciBpcyB3aXJlZC1pbiwKLSMgc2VlIGZ1bmN0aW9uIHNlbGVjdG9yKCkgYmVsb3cuICAoSXQgY3VycmVudGx5IHNlYXJjaGVzIGZvciBmaWxlcyB3aXRoCi0jIHdvcmxkIHdyaXRlIHBlcm1pc3Npb24uKQotCi0jIFVzYWdlOiBwYXJmaW5kLnB5IFstdyBud29ya2Vyc10gW2RpcmVjdG9yeV0gLi4uCi0jIERlZmF1bHQgbndvcmtlcnMgaXMgNAotCi0KLWltcG9ydCBzeXMKLWltcG9ydCBnZXRvcHQKLWltcG9ydCB0aW1lCi1pbXBvcnQgb3MKLWZyb20gc3RhdCBpbXBvcnQgKgotaW1wb3J0IF90aHJlYWQgYXMgdGhyZWFkCi0KLQotIyBXb3JrIHF1ZXVlIGNsYXNzLiAgVXNhZ2U6Ci0jICAgd3EgPSBXb3JrUSgpCi0jICAgd3EuYWRkd29yayhmdW5jLCAoYXJnMSwgYXJnMiwgLi4uKSkgIyBvbmUgb3IgbW9yZSBjYWxscwotIyAgIHdxLnJ1bihud29ya2VycykKLSMgVGhlIHdvcmsgaXMgZG9uZSB3aGVuIHdxLnJ1bigpIGNvbXBsZXRlcy4KLSMgVGhlIGZ1bmN0aW9uIGNhbGxzIGV4ZWN1dGVkIGJ5IHRoZSB3b3JrZXJzIG1heSBhZGQgbW9yZSB3b3JrLgotIyBEb24ndCB1c2Uga2V5Ym9hcmQgaW50ZXJydXB0cyEKLQotY2xhc3MgV29ya1E6Ci0KLSAgICAjIEludmFyaWFudHM6Ci0KLSAgICAjIC0gYnVzeSBhbmQgd29yayBhcmUgb25seSBtb2RpZmllZCB3aGVuIG11dGV4IGlzIGxvY2tlZAotICAgICMgLSBsZW4od29yaykgaXMgdGhlIG51bWJlciBvZiBqb2JzIHJlYWR5IHRvIGJlIHRha2VuCi0gICAgIyAtIGJ1c3kgaXMgdGhlIG51bWJlciBvZiBqb2JzIGJlaW5nIGRvbmUKLSAgICAjIC0gdG9kbyBpcyBsb2NrZWQgaWZmIHRoZXJlIGlzIG5vIHdvcmsgYW5kIHNvbWVib2R5IGlzIGJ1c3kKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5tdXRleCA9IHRocmVhZC5hbGxvY2F0ZSgpCi0gICAgICAgIHNlbGYudG9kbyA9IHRocmVhZC5hbGxvY2F0ZSgpCi0gICAgICAgIHNlbGYudG9kby5hY3F1aXJlKCkKLSAgICAgICAgc2VsZi53b3JrID0gW10KLSAgICAgICAgc2VsZi5idXN5ID0gMAotCi0gICAgZGVmIGFkZHdvcmsoc2VsZiwgZnVuYywgYXJncyk6Ci0gICAgICAgIGpvYiA9IChmdW5jLCBhcmdzKQotICAgICAgICBzZWxmLm11dGV4LmFjcXVpcmUoKQotICAgICAgICBzZWxmLndvcmsuYXBwZW5kKGpvYikKLSAgICAgICAgc2VsZi5tdXRleC5yZWxlYXNlKCkKLSAgICAgICAgaWYgbGVuKHNlbGYud29yaykgPT0gMToKLSAgICAgICAgICAgIHNlbGYudG9kby5yZWxlYXNlKCkKLQotICAgIGRlZiBfZ2V0d29yayhzZWxmKToKLSAgICAgICAgc2VsZi50b2RvLmFjcXVpcmUoKQotICAgICAgICBzZWxmLm11dGV4LmFjcXVpcmUoKQotICAgICAgICBpZiBzZWxmLmJ1c3kgPT0gMCBhbmQgbGVuKHNlbGYud29yaykgPT0gMDoKLSAgICAgICAgICAgIHNlbGYubXV0ZXgucmVsZWFzZSgpCi0gICAgICAgICAgICBzZWxmLnRvZG8ucmVsZWFzZSgpCi0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICBqb2IgPSBzZWxmLndvcmtbMF0KLSAgICAgICAgZGVsIHNlbGYud29ya1swXQotICAgICAgICBzZWxmLmJ1c3kgPSBzZWxmLmJ1c3kgKyAxCi0gICAgICAgIHNlbGYubXV0ZXgucmVsZWFzZSgpCi0gICAgICAgIGlmIGxlbihzZWxmLndvcmspID4gMDoKLSAgICAgICAgICAgIHNlbGYudG9kby5yZWxlYXNlKCkKLSAgICAgICAgcmV0dXJuIGpvYgotCi0gICAgZGVmIF9kb25ld29yayhzZWxmKToKLSAgICAgICAgc2VsZi5tdXRleC5hY3F1aXJlKCkKLSAgICAgICAgc2VsZi5idXN5ID0gc2VsZi5idXN5IC0gMQotICAgICAgICBpZiBzZWxmLmJ1c3kgPT0gMCBhbmQgbGVuKHNlbGYud29yaykgPT0gMDoKLSAgICAgICAgICAgIHNlbGYudG9kby5yZWxlYXNlKCkKLSAgICAgICAgc2VsZi5tdXRleC5yZWxlYXNlKCkKLQotICAgIGRlZiBfd29ya2VyKHNlbGYpOgotICAgICAgICB0aW1lLnNsZWVwKDAuMDAwMDEpICAgICAjIExldCBvdGhlciB0aHJlYWRzIHJ1bgotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgam9iID0gc2VsZi5fZ2V0d29yaygpCi0gICAgICAgICAgICBpZiBub3Qgam9iOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBmdW5jLCBhcmdzID0gam9iCi0gICAgICAgICAgICBmdW5jKCphcmdzKQotICAgICAgICAgICAgc2VsZi5fZG9uZXdvcmsoKQotCi0gICAgZGVmIHJ1bihzZWxmLCBud29ya2Vycyk6Ci0gICAgICAgIGlmIG5vdCBzZWxmLndvcms6Ci0gICAgICAgICAgICByZXR1cm4gIyBOb3RoaW5nIHRvIGRvCi0gICAgICAgIGZvciBpIGluIHJhbmdlKG53b3JrZXJzLTEpOgotICAgICAgICAgICAgdGhyZWFkLnN0YXJ0X25ldyhzZWxmLl93b3JrZXIsICgpKQotICAgICAgICBzZWxmLl93b3JrZXIoKQotICAgICAgICBzZWxmLnRvZG8uYWNxdWlyZSgpCi0KLQotIyBNYWluIHByb2dyYW0KLQotZGVmIG1haW4oKToKLSAgICBud29ya2VycyA9IDQKLSAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICctdzonKQotICAgIGZvciBvcHQsIGFyZyBpbiBvcHRzOgotICAgICAgICBpZiBvcHQgPT0gJy13JzoKLSAgICAgICAgICAgIG53b3JrZXJzID0gaW50KGFyZykKLSAgICBpZiBub3QgYXJnczoKLSAgICAgICAgYXJncyA9IFtvcy5jdXJkaXJdCi0KLSAgICB3cSA9IFdvcmtRKCkKLSAgICBmb3IgZGlyIGluIGFyZ3M6Ci0gICAgICAgIHdxLmFkZHdvcmsoZmluZCwgKGRpciwgc2VsZWN0b3IsIHdxKSkKLQotICAgIHQxID0gdGltZS50aW1lKCkKLSAgICB3cS5ydW4obndvcmtlcnMpCi0gICAgdDIgPSB0aW1lLnRpbWUoKQotCi0gICAgc3lzLnN0ZGVyci53cml0ZSgnVG90YWwgdGltZSAlciBzZWMuXG4nICUgKHQyLXQxKSkKLQotCi0jIFRoZSBwcmVkaWNhdGUgLS0gZGVmaW5lcyB3aGF0IGZpbGVzIHdlIGxvb2sgZm9yLgotIyBGZWVsIGZyZWUgdG8gY2hhbmdlIHRoaXMgdG8gc3VpdCB5b3VyIHB1cnBvc2UKLQotZGVmIHNlbGVjdG9yKGRpciwgbmFtZSwgZnVsbG5hbWUsIHN0YXQpOgotICAgICMgTG9vayBmb3Igd29ybGQgd3JpdGFibGUgZmlsZXMgdGhhdCBhcmUgbm90IHN5bWxpbmtzCi0gICAgcmV0dXJuIChzdGF0W1NUX01PREVdICYgMG8wMDIpICE9IDAgYW5kIG5vdCBTX0lTTE5LKHN0YXRbU1RfTU9ERV0pCi0KLQotIyBUaGUgZmluZCBwcm9jZWR1cmUgLS0gY2FsbHMgd3EuYWRkd29yaygpIGZvciBzdWJkaXJlY3RvcmllcwotCi1kZWYgZmluZChkaXIsIHByZWQsIHdxKToKLSAgICB0cnk6Ci0gICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXIpCi0gICAgZXhjZXB0IG9zLmVycm9yIGFzIG1zZzoKLSAgICAgICAgcHJpbnQocmVwcihkaXIpLCAnOicsIG1zZykKLSAgICAgICAgcmV0dXJuCi0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgIGlmIG5hbWUgbm90IGluIChvcy5jdXJkaXIsIG9zLnBhcmRpcik6Ci0gICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihkaXIsIG5hbWUpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc3RhdCA9IG9zLmxzdGF0KGZ1bGxuYW1lKQotICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yIGFzIG1zZzoKLSAgICAgICAgICAgICAgICBwcmludChyZXByKGZ1bGxuYW1lKSwgJzonLCBtc2cpCi0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGlmIHByZWQoZGlyLCBuYW1lLCBmdWxsbmFtZSwgc3RhdCk6Ci0gICAgICAgICAgICAgICAgcHJpbnQoZnVsbG5hbWUpCi0gICAgICAgICAgICBpZiBTX0lTRElSKHN0YXRbU1RfTU9ERV0pOgotICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzbW91bnQoZnVsbG5hbWUpOgotICAgICAgICAgICAgICAgICAgICB3cS5hZGR3b3JrKGZpbmQsIChmdWxsbmFtZSwgcHJlZCwgd3EpKQotCi0KLSMgQ2FsbCB0aGUgbWFpbiBwcm9ncmFtCi0KLW1haW4oKQpkaWZmIC0tZ2l0IGEvRGVtby90aHJlYWRzL3NxdWFzaGVyLnB5IGIvRGVtby90aHJlYWRzL3NxdWFzaGVyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWIxYjFkLi4wMDAwMDAwCi0tLSBhL0RlbW8vdGhyZWFkcy9zcXVhc2hlci5weQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0jIENvcm91dGluZSBleGFtcGxlOiAgZ2VuZXJhbCBjb3JvdXRpbmUgdHJhbnNmZXJzCi0jCi0jIFRoZSBwcm9ncmFtIGlzIGEgdmFyaWF0aW9uIG9mIGEgU2ltdWxhIDY3IHByb2dyYW0gZHVlIHRvIERhaGwgJiBIb2FyZSwKLSMgKERhaGwvRGlqa3N0cmEvSG9hcmUsIFN0cnVjdHVyZWQgUHJvZ3JhbW1pbmc7IEFjYWRlbWljIFByZXNzLCAxOTcyKQotIyB3aG8gaW4gdHVybiBjcmVkaXQgdGhlIG9yaWdpbmFsIGV4YW1wbGUgdG8gQ29ud2F5LgotIwotIyBXZSBoYXZlIGEgbnVtYmVyIG9mIGlucHV0IGxpbmVzLCB0ZXJtaW5hdGVkIGJ5IGEgMCBieXRlLiAgVGhlIHByb2JsZW0KLSMgaXMgdG8gc3F1YXNoIHRoZW0gdG9nZXRoZXIgaW50byBvdXRwdXQgbGluZXMgY29udGFpbmluZyA3MiBjaGFyYWN0ZXJzCi0jIGVhY2guICBBIHNlbWljb2xvbiBtdXN0IGJlIGFkZGVkIGJldHdlZW4gaW5wdXQgbGluZXMuICBSdW5zIG9mIGJsYW5rcwotIyBhbmQgdGFicyBpbiBpbnB1dCBsaW5lcyBtdXN0IGJlIHNxdWFzaGVkIGludG8gc2luZ2xlIGJsYW5rcy4KLSMgT2NjdXJyZW5jZXMgb2YgIioqIiBpbiBpbnB1dCBsaW5lcyBtdXN0IGJlIHJlcGxhY2VkIGJ5ICJeIi4KLSMKLSMgSGVyZSdzIGEgdGVzdCBjYXNlOgotCi10ZXN0ID0gIiIiXAotICAgZCAgICA9ICAgc3FydChiKioyICAtICA0KmEqYykKLXR3b2EgICAgPSAgIDIqYQotICAgTCAgICA9ICAgLWIvdHdvYQotICAgUiAgICA9ICAgZC90d29hCi0gIEExICAgID0gICBMICsgUgotICBBMiAgICA9ICAgTCAtIFJcMAotIiIiCi0KLSMgVGhlIHByb2dyYW0gc2hvdWxkIHByaW50OgotCi0jIGQgPSBzcXJ0KGJeMiAtIDQqYSpjKTt0d29hID0gMiphOyBMID0gLWIvdHdvYTsgUiA9IGQvdHdvYTsgQTEgPSBMICsgUjsKLSNBMiA9IEwgLSBSCi0jZG9uZQotCi0jIGdldGxpbmU6IGRlbGl2ZXJzIHRoZSBuZXh0IGlucHV0IGxpbmUgdG8gaXRzIGludm9rZXIKLSMgZGlzYXNzZW1ibGVyOiBncmFicyBpbnB1dCBsaW5lcyBmcm9tIGdldGxpbmUsIGFuZCBkZWxpdmVycyB0aGVtIG9uZQotIyAgICBjaGFyYWN0ZXIgYXQgYSB0aW1lIHRvIHNxdWFzaGVyLCBhbHNvIGluc2VydGluZyBhIHNlbWljb2xvbiBpbnRvCi0jICAgIHRoZSBzdHJlYW0gYmV0d2VlbiBsaW5lcwotIyBzcXVhc2hlcjogIGdyYWJzIGNoYXJhY3RlcnMgZnJvbSBkaXNhc3NlbWJsZXIgYW5kIHBhc3NlcyB0aGVtIG9uIHRvCi0jICAgIGFzc2VtYmxlciwgZmlyc3QgcmVwbGFjaW5nICIqKiIgd2l0aCAiXiIgYW5kIHNxdWFzaGluZyBydW5zIG9mCi0jICAgIHdoaXRlc3BhY2UKLSMgYXNzZW1ibGVyOiBncmFicyBjaGFyYWN0ZXJzIGZyb20gc3F1YXNoZXIgYW5kIHBhY2tzIHRoZW0gaW50byBsaW5lcwotIyAgICB3aXRoIDcyIGNoYXJhY3RlciBlYWNoLCBkZWxpdmVyaW5nIGVhY2ggc3VjaCBsaW5lIHRvIHB1dGxpbmU7Ci0jICAgIHdoZW4gaXQgc2VlcyBhIG51bGwgYnl0ZSwgcGFzc2VzIHRoZSBsYXN0IGxpbmUgdG8gcHV0bGluZSBhbmQKLSMgICAgdGhlbiBraWxscyBhbGwgdGhlIGNvcm91dGluZXMKLSMgcHV0bGluZTogZ3JhYnMgbGluZXMgZnJvbSBhc3NlbWJsZXIsIGFuZCBqdXN0IHByaW50cyB0aGVtCi0KLWZyb20gQ29yb3V0aW5lIGltcG9ydCAqCi0KLWRlZiBnZXRsaW5lKHRleHQpOgotICAgIGZvciBsaW5lIGluIHN0cmluZy5zcGxpdGZpZWxkcyh0ZXh0LCAnXG4nKToKLSAgICAgICAgY28udHJhbihjb2Rpc2Fzc2VtYmxlciwgbGluZSkKLQotZGVmIGRpc2Fzc2VtYmxlcigpOgotICAgIHdoaWxlIDE6Ci0gICAgICAgIGNhcmQgPSBjby50cmFuKGNvZ2V0bGluZSkKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGNhcmQpKToKLSAgICAgICAgICAgIGNvLnRyYW4oY29zcXVhc2hlciwgY2FyZFtpXSkKLSAgICAgICAgY28udHJhbihjb3NxdWFzaGVyLCAnOycpCi0KLWRlZiBzcXVhc2hlcigpOgotICAgIHdoaWxlIDE6Ci0gICAgICAgIGNoID0gY28udHJhbihjb2Rpc2Fzc2VtYmxlcikKLSAgICAgICAgaWYgY2ggPT0gJyonOgotICAgICAgICAgICAgY2gyID0gY28udHJhbihjb2Rpc2Fzc2VtYmxlcikKLSAgICAgICAgICAgIGlmIGNoMiA9PSAnKic6Ci0gICAgICAgICAgICAgICAgY2ggPSAnXicKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgY28udHJhbihjb2Fzc2VtYmxlciwgY2gpCi0gICAgICAgICAgICAgICAgY2ggPSBjaDIKLSAgICAgICAgaWYgY2ggaW4gJyBcdCc6Ci0gICAgICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgICAgIGNoMiA9IGNvLnRyYW4oY29kaXNhc3NlbWJsZXIpCi0gICAgICAgICAgICAgICAgaWYgY2gyIG5vdCBpbiAnIFx0JzoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGNvLnRyYW4oY29hc3NlbWJsZXIsICcgJykKLSAgICAgICAgICAgIGNoID0gY2gyCi0gICAgICAgIGNvLnRyYW4oY29hc3NlbWJsZXIsIGNoKQotCi1kZWYgYXNzZW1ibGVyKCk6Ci0gICAgbGluZSA9ICcnCi0gICAgd2hpbGUgMToKLSAgICAgICAgY2ggPSBjby50cmFuKGNvc3F1YXNoZXIpCi0gICAgICAgIGlmIGNoID09ICdcMCc6Ci0gICAgICAgICAgICBicmVhawotICAgICAgICBpZiBsZW4obGluZSkgPT0gNzI6Ci0gICAgICAgICAgICBjby50cmFuKGNvcHV0bGluZSwgbGluZSkKLSAgICAgICAgICAgIGxpbmUgPSAnJwotICAgICAgICBsaW5lID0gbGluZSArIGNoCi0gICAgbGluZSA9IGxpbmUgKyAnICcgKiAoNzIgLSBsZW4obGluZSkpCi0gICAgY28udHJhbihjb3B1dGxpbmUsIGxpbmUpCi0gICAgY28ua2lsbCgpCi0KLWRlZiBwdXRsaW5lKCk6Ci0gICAgd2hpbGUgMToKLSAgICAgICAgbGluZSA9IGNvLnRyYW4oY29hc3NlbWJsZXIpCi0gICAgICAgIHByaW50KGxpbmUpCi0KLWltcG9ydCBzdHJpbmcKLWNvID0gQ29yb3V0aW5lKCkKLWNvZ2V0bGluZSA9IGNvLmNyZWF0ZShnZXRsaW5lLCB0ZXN0KQotY29wdXRsaW5lID0gY28uY3JlYXRlKHB1dGxpbmUpCi1jb2Fzc2VtYmxlciA9IGNvLmNyZWF0ZShhc3NlbWJsZXIpCi1jb2Rpc2Fzc2VtYmxlciA9IGNvLmNyZWF0ZShkaXNhc3NlbWJsZXIpCi1jb3NxdWFzaGVyID0gY28uY3JlYXRlKHNxdWFzaGVyKQotCi1jby50cmFuKGNvcHV0bGluZSkKLXByaW50KCdkb25lJykKLQotIyBlbmQgb2YgZXhhbXBsZQpkaWZmIC0tZ2l0IGEvRGVtby90aHJlYWRzL3N5bmMucHkgYi9EZW1vL3RocmVhZHMvc3luYy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmZmYyZS4uMDAwMDAwMAotLS0gYS9EZW1vL3RocmVhZHMvc3luYy5weQorKysgL2Rldi9udWxsCkBAIC0xLDU5OSArMCwwIEBACi0jIERlZmluZXMgY2xhc3NlcyB0aGF0IHByb3ZpZGUgc3luY2hyb25pemF0aW9uIG9iamVjdHMuICBOb3RlIHRoYXQgdXNlIG9mCi0jIHRoaXMgbW9kdWxlIHJlcXVpcmVzIHRoYXQgeW91ciBQeXRob24gc3VwcG9ydCB0aHJlYWRzLgotIwotIyAgICBjb25kaXRpb24obG9jaz1Ob25lKSAgICAgICAjIGEgUE9TSVgtbGlrZSBjb25kaXRpb24tdmFyaWFibGUgb2JqZWN0Ci0jICAgIGJhcnJpZXIobikgICAgICAgICAgICAgICAgICMgYW4gbi10aHJlYWQgYmFycmllcgotIyAgICBldmVudCgpICAgICAgICAgICAgICAgICAgICAjIGFuIGV2ZW50IG9iamVjdAotIyAgICBzZW1hcGhvcmUobj0xKSAgICAgICAgICAgICAjIGEgc2VtYXBob3JlIG9iamVjdCwgd2l0aCBpbml0aWFsIGNvdW50IG4KLSMgICAgbXJzdygpICAgICAgICAgICAgICAgICAgICAgIyBhIG11bHRpcGxlLXJlYWRlciBzaW5nbGUtd3JpdGVyIGxvY2sKLSMKLSMgQ09ORElUSU9OUwotIwotIyBBIGNvbmRpdGlvbiBvYmplY3QgaXMgY3JlYXRlZCB2aWEKLSMgICBpbXBvcnQgdGhpc19tb2R1bGUKLSMgICB5b3VyX2NvbmRpdGlvbl9vYmplY3QgPSB0aGlzX21vZHVsZS5jb25kaXRpb24obG9jaz1Ob25lKQotIwotIyBBcyBleHBsYWluZWQgYmVsb3csIGEgY29uZGl0aW9uIG9iamVjdCBoYXMgYSBsb2NrIGFzc29jaWF0ZWQgd2l0aCBpdCwKLSMgdXNlZCBpbiB0aGUgcHJvdG9jb2wgdG8gcHJvdGVjdCBjb25kaXRpb24gZGF0YS4gIFlvdSBjYW4gc3BlY2lmeSBhCi0jIGxvY2sgdG8gdXNlIGluIHRoZSBjb25zdHJ1Y3RvciwgZWxzZSB0aGUgY29uc3RydWN0b3Igd2lsbCBhbGxvY2F0ZQotIyBhbiBhbm9ueW1vdXMgbG9jayBmb3IgeW91LiAgU3BlY2lmeWluZyBhIGxvY2sgZXhwbGljaXRseSBjYW4gYmUgdXNlZnVsCi0jIHdoZW4gbW9yZSB0aGFuIG9uZSBjb25kaXRpb24ga2V5cyBvZmYgdGhlIHNhbWUgc2V0IG9mIHNoYXJlZCBkYXRhLgotIwotIyBNZXRob2RzOgotIyAgIC5hY3F1aXJlKCkKLSMgICAgICBhY3F1aXJlIHRoZSBsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZGl0aW9uCi0jICAgLnJlbGVhc2UoKQotIyAgICAgIHJlbGVhc2UgdGhlIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25kaXRpb24KLSMgICAud2FpdCgpCi0jICAgICAgYmxvY2sgdGhlIHRocmVhZCB1bnRpbCBzdWNoIHRpbWUgYXMgc29tZSBvdGhlciB0aHJlYWQgZG9lcyBhCi0jICAgICAgLnNpZ25hbCBvciAuYnJvYWRjYXN0IG9uIHRoZSBzYW1lIGNvbmRpdGlvbiwgYW5kIHJlbGVhc2UgdGhlCi0jICAgICAgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbmRpdGlvbi4gIFRoZSBsb2NrIGFzc29jaWF0ZWQgd2l0aAotIyAgICAgIHRoZSBjb25kaXRpb24gTVVTVCBiZSBpbiB0aGUgYWNxdWlyZWQgc3RhdGUgYXQgdGhlIHRpbWUKLSMgICAgICAud2FpdCBpcyBpbnZva2VkLgotIyAgIC5zaWduYWwoKQotIyAgICAgIHdha2UgdXAgZXhhY3RseSBvbmUgdGhyZWFkIChpZiBhbnkpIHRoYXQgcHJldmlvdXNseSBkaWQgYSAud2FpdAotIyAgICAgIG9uIHRoZSBjb25kaXRpb247IHRoYXQgdGhyZWFkIHdpbGwgYXdha2VuIHdpdGggdGhlIGxvY2sgYXNzb2NpYXRlZAotIyAgICAgIHdpdGggdGhlIGNvbmRpdGlvbiBpbiB0aGUgYWNxdWlyZWQgc3RhdGUuICBJZiBubyB0aHJlYWRzIGFyZQotIyAgICAgIC53YWl0J2luZywgdGhpcyBpcyBhIG5vcC4gIElmIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGlzIC53YWl0J2luZyBvbgotIyAgICAgIHRoZSBjb25kaXRpb24sIGFueSBvZiB0aGVtIG1heSBiZSBhd2FrZW5lZC4KLSMgICAuYnJvYWRjYXN0KCkKLSMgICAgICB3YWtlIHVwIGFsbCB0aHJlYWRzIChpZiBhbnkpIHRoYXQgYXJlIC53YWl0J2luZyBvbiB0aGUgY29uZGl0aW9uOwotIyAgICAgIHRoZSB0aHJlYWRzIGFyZSB3b2tlbiB1cCBzZXJpYWxseSwgZWFjaCB3aXRoIHRoZSBsb2NrIGluIHRoZQotIyAgICAgIGFjcXVpcmVkIHN0YXRlLCBzbyBzaG91bGQgLnJlbGVhc2UoKSBhcyBzb29uIGFzIHBvc3NpYmxlLiAgSWYgbm8KLSMgICAgICB0aHJlYWRzIGFyZSAud2FpdCdpbmcsIHRoaXMgaXMgYSBub3AuCi0jCi0jICAgICAgTm90ZSB0aGF0IGlmIGEgdGhyZWFkIGRvZXMgYSAud2FpdCAqd2hpbGUqIGEgc2lnbmFsL2Jyb2FkY2FzdCBpcwotIyAgICAgIGluIHByb2dyZXNzLCBpdCdzIGd1YXJhbnRlZWVkIHRvIGJsb2NrIHVudGlsIGEgc3Vic2VxdWVudAotIyAgICAgIHNpZ25hbC9icm9hZGNhc3QuCi0jCi0jICAgICAgU2VjcmV0IGZlYXR1cmU6ICBgYnJvYWRjYXN0JyBhY3R1YWxseSB0YWtlcyBhbiBpbnRlZ2VyIGFyZ3VtZW50LAotIyAgICAgIGFuZCB3aWxsIHdha2UgdXAgZXhhY3RseSB0aGF0IG1hbnkgd2FpdGluZyB0aHJlYWRzIChvciB0aGUgdG90YWwKLSMgICAgICBudW1iZXIgd2FpdGluZywgaWYgdGhhdCdzIGxlc3MpLiAgVXNlIG9mIHRoaXMgaXMgZHViaW91cywgdGhvdWdoLAotIyAgICAgIGFuZCBwcm9iYWJseSB3b24ndCBiZSBzdXBwb3J0ZWQgaWYgdGhpcyBmb3JtIG9mIGNvbmRpdGlvbiBpcwotIyAgICAgIHJlaW1wbGVtZW50ZWQgaW4gQy4KLSMKLSMgRElGRkVSRU5DRVMgRlJPTSBQT1NJWAotIwotIyArIEEgc2VwYXJhdGUgbXV0ZXggaXMgbm90IG5lZWRlZCB0byBndWFyZCBjb25kaXRpb24gZGF0YS4gIEluc3RlYWQsIGEKLSMgICBjb25kaXRpb24gb2JqZWN0IGNhbiAobXVzdCkgYmUgLmFjcXVpcmUnZWQgYW5kIC5yZWxlYXNlJ2VkIGRpcmVjdGx5LgotIyAgIFRoaXMgZWxpbWluYXRlcyBhIGNvbW1vbiBlcnJvciBpbiB1c2luZyBQT1NJWCBjb25kaXRpb25zLgotIwotIyArIEJlY2F1c2Ugb2YgaW1wbGVtZW50YXRpb24gZGlmZmljdWx0aWVzLCBhIFBPU0lYIGBzaWduYWwnIHdha2VzIHVwCi0jICAgX2F0IGxlYXN0XyBvbmUgLndhaXQnaW5nIHRocmVhZC4gIFJhY2UgY29uZGl0aW9ucyBtYWtlIGl0IGRpZmZpY3VsdAotIyAgIHRvIHN0b3AgdGhhdC4gIFRoaXMgaW1wbGVtZW50YXRpb24gZ3VhcmFudGVlcyB0byB3YWtlIHVwIG9ubHkgb25lLAotIyAgIGJ1dCB5b3UgcHJvYmFibHkgc2hvdWxkbid0IHJlbHkgb24gdGhhdC4KLSMKLSMgUFJPVE9DT0wKLSMKLSMgQ29uZGl0aW9uIG9iamVjdHMgYXJlIHVzZWQgdG8gYmxvY2sgdGhyZWFkcyB1bnRpbCAic29tZSBjb25kaXRpb24iIGlzCi0jIHRydWUuICBFLmcuLCBhIHRocmVhZCBtYXkgd2lzaCB0byB3YWl0IHVudGlsIGEgcHJvZHVjZXIgcHVtcHMgb3V0IGRhdGEKLSMgZm9yIGl0IHRvIGNvbnN1bWUsIG9yIGEgc2VydmVyIG1heSB3aXNoIHRvIHdhaXQgdW50aWwgc29tZW9uZSByZXF1ZXN0cwotIyBpdHMgc2VydmljZXMsIG9yIHBlcmhhcHMgYSB3aG9sZSBidW5jaCBvZiB0aHJlYWRzIHdhbnQgdG8gd2FpdCB1bnRpbCBhCi0jIHByZWNlZGluZyBwYXNzIG92ZXIgdGhlIGRhdGEgaXMgY29tcGxldGUuICBFYXJseSBtb2RlbHMgZm9yIGNvbmRpdGlvbnMKLSMgcmVsaWVkIG9uIHNvbWUgb3RoZXIgdGhyZWFkIGZpZ3VyaW5nIG91dCB3aGVuIGEgYmxvY2tlZCB0aHJlYWQncwotIyBjb25kaXRpb24gd2FzIHRydWUsIGFuZCBtYWRlIHRoZSBvdGhlciB0aHJlYWQgcmVzcG9uc2libGUgYm90aCBmb3IKLSMgd2FraW5nIHVwIHRoZSBibG9ja2VkIHRocmVhZCBhbmQgZ3VhcmFudGVlaW5nIHRoYXQgaXQgd29rZSB1cCB3aXRoIGFsbAotIyBkYXRhIGluIGEgY29ycmVjdCBzdGF0ZS4gIFRoaXMgcHJvdmVkIHRvIGJlIHZlcnkgZGVsaWNhdGUgaW4gcHJhY3RpY2UsCi0jIGFuZCBnYXZlIGNvbmRpdGlvbnMgYSBiYWQgbmFtZSBpbiBzb21lIGNpcmNsZXMuCi0jCi0jIFRoZSBQT1NJWCBtb2RlbCBhZGRyZXNzZXMgdGhlc2UgcHJvYmxlbXMgYnkgbWFraW5nIGEgdGhyZWFkIHJlc3BvbnNpYmxlCi0jIGZvciBlbnN1cmluZyB0aGF0IGl0cyBvd24gc3RhdGUgaXMgY29ycmVjdCB3aGVuIGl0IHdha2VzLCBhbmQgcmVsaWVzCi0jIG9uIGEgcmlnaWQgcHJvdG9jb2wgdG8gbWFrZSB0aGlzIGVhc3k7IHNvIGxvbmcgYXMgeW91IHN0aWNrIHRvIHRoZQotIyBwcm90b2NvbCwgUE9TSVggY29uZGl0aW9ucyBhcmUgZWFzeSB0byAiZ2V0IHJpZ2h0IjoKLSMKLSMgIEEpIFRoZSB0aHJlYWQgdGhhdCdzIHdhaXRpbmcgZm9yIHNvbWUgYXJiaXRyYXJpbHktY29tcGxleCBjb25kaXRpb24KLSMgICAgIChBQ0MpIHRvIGJlY29tZSB0cnVlIGRvZXM6Ci0jCi0jICAgICBjb25kaXRpb24uYWNxdWlyZSgpCi0jICAgICB3aGlsZSBub3QgKGNvZGUgdG8gZXZhbHVhdGUgdGhlIEFDQyk6Ci0jICAgICAgICAgICBjb25kaXRpb24ud2FpdCgpCi0jICAgICAgICAgICAjIFRoYXQgYmxvY2tzIHRoZSB0aHJlYWQsICphbmQqIHJlbGVhc2VzIHRoZSBsb2NrLiAgV2hlbiBhCi0jICAgICAgICAgICAjIGNvbmRpdGlvbi5zaWduYWwoKSBoYXBwZW5zLCBpdCB3aWxsIHdha2UgdXAgc29tZSB0aHJlYWQgdGhhdAotIyAgICAgICAgICAgIyBkaWQgYSAud2FpdCwgKmFuZCogYWNxdWlyZSB0aGUgbG9jayBhZ2FpbiBiZWZvcmUgLndhaXQKLSMgICAgICAgICAgICMgcmV0dXJucy4KLSMgICAgICAgICAgICMKLSMgICAgICAgICAgICMgQmVjYXVzZSB0aGUgbG9jayBpcyBhY3F1aXJlZCBhdCB0aGlzIHBvaW50LCB0aGUgc3RhdGUgdXNlZAotIyAgICAgICAgICAgIyBpbiBldmFsdWF0aW5nIHRoZSBBQ0MgaXMgZnJvemVuLCBzbyBpdCdzIHNhZmUgdG8gZ28gYmFjayAmCi0jICAgICAgICAgICAjIHJlZXZhbHVhdGUgdGhlIEFDQy4KLSMKLSMgICAgICMgQXQgdGhpcyBwb2ludCwgQUNDIGlzIHRydWUsIGFuZCB0aGUgdGhyZWFkIGhhcyB0aGUgY29uZGl0aW9uCi0jICAgICAjIGxvY2tlZC4KLSMgICAgICMgU28gY29kZSBoZXJlIGNhbiBzYWZlbHkgbXVjayB3aXRoIHRoZSBzaGFyZWQgc3RhdGUgdGhhdAotIyAgICAgIyB3ZW50IGludG8gZXZhbHVhdGluZyB0aGUgQUNDIC0tIGlmIGl0IHdhbnRzIHRvLgotIyAgICAgIyBXaGVuIGRvbmUgbXVja2luZyB3aXRoIHRoZSBzaGFyZWQgc3RhdGUsIGRvCi0jICAgICBjb25kaXRpb24ucmVsZWFzZSgpCi0jCi0jICBCKSBUaHJlYWRzIHRoYXQgYXJlIG11Y2tpbmcgd2l0aCBzaGFyZWQgc3RhdGUgdGhhdCBtYXkgYWZmZWN0IHRoZQotIyAgICAgQUNDIGRvOgotIwotIyAgICAgY29uZGl0aW9uLmFjcXVpcmUoKQotIyAgICAgIyBtdWNrIHdpdGggc2hhcmVkIHN0YXRlCi0jICAgICBjb25kaXRpb24ucmVsZWFzZSgpCi0jICAgICBpZiBpdCdzIHBvc3NpYmxlIHRoYXQgQUNDIGlzIHRydWUgbm93OgotIyAgICAgICAgIGNvbmRpdGlvbi5zaWduYWwoKSAjIG9yIC5icm9hZGNhc3QoKQotIwotIyAgICAgTm90ZTogIFlvdSBtYXkgcHJlZmVyIHRvIHB1dCB0aGUgImlmIiBjbGF1c2UgYmVmb3JlIHRoZSByZWxlYXNlKCkuCi0jICAgICBUaGF0J3MgZmluZSwgYnV0IGRvIG5vdGUgdGhhdCBhbnlvbmUgd2FpdGluZyBvbiB0aGUgc2lnbmFsIHdpbGwKLSMgICAgIHN0YXkgYmxvY2tlZCB1bnRpbCB0aGUgcmVsZWFzZSgpIGlzIGRvbmUgKHNpbmNlIGFjcXVpcmluZyB0aGUKLSMgICAgIGNvbmRpdGlvbiBpcyBwYXJ0IG9mIHdoYXQgLndhaXQoKSBkb2VzIGJlZm9yZSBpdCByZXR1cm5zKS4KLSMKLSMgVFJJQ0sgT0YgVEhFIFRSQURFCi0jCi0jIFdpdGggc2ltcGxlciBmb3JtcyBvZiBjb25kaXRpb25zLCBpdCBjYW4gYmUgaW1wb3NzaWJsZSB0byBrbm93IHdoZW4KLSMgYSB0aHJlYWQgdGhhdCdzIHN1cHBvc2VkIHRvIGRvIGEgLndhaXQgaGFzIGFjdHVhbGx5IGRvbmUgaXQuICBCdXQKLSMgYmVjYXVzZSB0aGlzIGZvcm0gb2YgY29uZGl0aW9uIHJlbGVhc2VzIGEgbG9jayBhcyBfcGFydF8gb2YgZG9pbmcgYQotIyB3YWl0LCB0aGUgc3RhdGUgb2YgdGhhdCBsb2NrIGNhbiBiZSB1c2VkIHRvIGd1YXJhbnRlZSBpdC4KLSMKLSMgRS5nLiwgc3VwcG9zZSB0aHJlYWQgQSBzcGF3bnMgdGhyZWFkIEIgYW5kIGxhdGVyIHdhbnRzIHRvIHdhaXQgZm9yIEIgdG8KLSMgY29tcGxldGU6Ci0jCi0jIEluIEE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiBCOgotIwotIyBCX2RvbmUgPSBjb25kaXRpb24oKSAgICAgICAgICAgICAgLi4uIGRvIHdvcmsgLi4uCi0jIEJfZG9uZS5hY3F1aXJlKCkgICAgICAgICAgICAgICAgICBCX2RvbmUuYWNxdWlyZSgpOyBCX2RvbmUucmVsZWFzZSgpCi0jIHNwYXduIEIgICAgICAgICAgICAgICAgICAgICAgICAgICBCX2RvbmUuc2lnbmFsKCkKLSMgLi4uIHNvbWUgdGltZSBsYXRlciAuLi4gICAgICAgICAgIC4uLiBhbmQgQiBleGl0cyAuLi4KLSMgQl9kb25lLndhaXQoKQotIwotIyBCZWNhdXNlIEJfZG9uZSB3YXMgaW4gdGhlIGFjcXVpcmUnZCBzdGF0ZSBhdCB0aGUgdGltZSBCIHdhcyBzcGF3bmVkLAotIyBCJ3MgYXR0ZW1wdCB0byBhY3F1aXJlIEJfZG9uZSBjYW4ndCBzdWNjZWVkIHVudGlsIEEgaGFzIGRvbmUgaXRzCi0jIEJfZG9uZS53YWl0KCkgKHdoaWNoIHJlbGVhc2VzIEJfZG9uZSkuICBTbyBCJ3MgQl9kb25lLnNpZ25hbCgpIGlzCi0jIGd1YXJhbnRlZWQgdG8gYmUgc2VlbiBieSB0aGUgLndhaXQoKS4gIFdpdGhvdXQgdGhlIGxvY2sgdHJpY2ssIEIKLSMgbWF5IHNpZ25hbCBiZWZvcmUgQSAud2FpdHMsIGFuZCB0aGVuIEEgd291bGQgd2FpdCBmb3JldmVyLgotIwotIyBCQVJSSUVSUwotIwotIyBBIGJhcnJpZXIgb2JqZWN0IGlzIGNyZWF0ZWQgdmlhCi0jICAgaW1wb3J0IHRoaXNfbW9kdWxlCi0jICAgeW91cl9iYXJyaWVyID0gdGhpc19tb2R1bGUuYmFycmllcihudW1fdGhyZWFkcykKLSMKLSMgTWV0aG9kczoKLSMgICAuZW50ZXIoKQotIyAgICAgIHRoZSB0aHJlYWQgYmxvY2tzIHVudGlsIG51bV90aHJlYWRzIHRocmVhZHMgaW4gYWxsIGhhdmUgZG9uZQotIyAgICAgIC5lbnRlcigpLiAgVGhlbiB0aGUgbnVtX3RocmVhZHMgdGhyZWFkcyB0aGF0IC5lbnRlcidlZCByZXN1bWUsCi0jICAgICAgYW5kIHRoZSBiYXJyaWVyIHJlc2V0cyB0byBjYXB0dXJlIHRoZSBuZXh0IG51bV90aHJlYWRzIHRocmVhZHMKLSMgICAgICB0aGF0IC5lbnRlciBpdC4KLSMKLSMgRVZFTlRTCi0jCi0jIEFuIGV2ZW50IG9iamVjdCBpcyBjcmVhdGVkIHZpYQotIyAgIGltcG9ydCB0aGlzX21vZHVsZQotIyAgIHlvdXJfZXZlbnQgPSB0aGlzX21vZHVsZS5ldmVudCgpCi0jCi0jIEFuIGV2ZW50IGhhcyB0d28gc3RhdGVzLCBgcG9zdGVkJyBhbmQgYGNsZWFyZWQnLiAgQW4gZXZlbnQgaXMKLSMgY3JlYXRlZCBpbiB0aGUgY2xlYXJlZCBzdGF0ZS4KLSMKLSMgTWV0aG9kczoKLSMKLSMgICAucG9zdCgpCi0jICAgICAgUHV0IHRoZSBldmVudCBpbiB0aGUgcG9zdGVkIHN0YXRlLCBhbmQgcmVzdW1lIGFsbCB0aHJlYWRzCi0jICAgICAgLndhaXQnaW5nIG9uIHRoZSBldmVudCAoaWYgYW55KS4KLSMKLSMgICAuY2xlYXIoKQotIyAgICAgIFB1dCB0aGUgZXZlbnQgaW4gdGhlIGNsZWFyZWQgc3RhdGUuCi0jCi0jICAgLmlzX3Bvc3RlZCgpCi0jICAgICAgUmV0dXJucyAwIGlmIHRoZSBldmVudCBpcyBpbiB0aGUgY2xlYXJlZCBzdGF0ZSwgb3IgMSBpZiB0aGUgZXZlbnQKLSMgICAgICBpcyBpbiB0aGUgcG9zdGVkIHN0YXRlLgotIwotIyAgIC53YWl0KCkKLSMgICAgICBJZiB0aGUgZXZlbnQgaXMgaW4gdGhlIHBvc3RlZCBzdGF0ZSwgcmV0dXJucyBpbW1lZGlhdGVseS4KLSMgICAgICBJZiB0aGUgZXZlbnQgaXMgaW4gdGhlIGNsZWFyZWQgc3RhdGUsIGJsb2NrcyB0aGUgY2FsbGluZyB0aHJlYWQKLSMgICAgICB1bnRpbCB0aGUgZXZlbnQgaXMgLnBvc3QnZWQgYnkgYW5vdGhlciB0aHJlYWQuCi0jCi0jIE5vdGUgdGhhdCBhbiBldmVudCwgb25jZSBwb3N0ZWQsIHJlbWFpbnMgcG9zdGVkIHVudGlsIGV4cGxpY2l0bHkKLSMgY2xlYXJlZC4gIFJlbGF0aXZlIHRvIGNvbmRpdGlvbnMsIHRoaXMgaXMgYm90aCB0aGUgc3RyZW5ndGggJiB3ZWFrbmVzcwotIyBvZiBldmVudHMuICBJdCdzIGEgc3RyZW5ndGggYmVjYXVzZSB0aGUgLnBvc3QnaW5nIHRocmVhZCBkb2Vzbid0IGhhdmUgdG8KLSMgd29ycnkgYWJvdXQgd2hldGhlciB0aGUgdGhyZWFkcyBpdCdzIHRyeWluZyB0byBjb21tdW5pY2F0ZSB3aXRoIGhhdmUKLSMgYWxyZWFkeSBkb25lIGEgLndhaXQgKGEgY29uZGl0aW9uIC5zaWduYWwgaXMgc2VlbiBvbmx5IGJ5IHRocmVhZHMgdGhhdAotIyBkbyBhIC53YWl0IF9wcmlvcl8gdG8gdGhlIC5zaWduYWw7IGEgLnNpZ25hbCBkb2VzIG5vdCBwZXJzaXN0KS4gIEJ1dAotIyBpdCdzIGEgd2Vha25lc3MgYmVjYXVzZSAuY2xlYXInaW5nIGFuIGV2ZW50IGlzIGVycm9yLXByb25lOiAgaXQncyBlYXN5Ci0jIHRvIG1pc3Rha2VubHkgLmNsZWFyIGFuIGV2ZW50IGJlZm9yZSBhbGwgdGhlIHRocmVhZHMgeW91IGludGVuZGVkIHRvCi0jIHNlZSB0aGUgZXZlbnQgZ2V0IGFyb3VuZCB0byAud2FpdCdpbmcgb24gaXQuICBCdXQgc28gbG9uZyBhcyB5b3UgZG9uJ3QKLSMgbmVlZCB0byAuY2xlYXIgYW4gZXZlbnQsIGV2ZW50cyBhcmUgZWFzeSB0byB1c2Ugc2FmZWx5LgotIwotIyBTRU1BUEhPUkVTCi0jCi0jIEEgc2VtYXBob3JlIG9iamVjdCBpcyBjcmVhdGVkIHZpYQotIyAgIGltcG9ydCB0aGlzX21vZHVsZQotIyAgIHlvdXJfc2VtYXBob3JlID0gdGhpc19tb2R1bGUuc2VtYXBob3JlKGNvdW50PTEpCi0jCi0jIEEgc2VtYXBob3JlIGhhcyBhbiBpbnRlZ2VyIGNvdW50IGFzc29jaWF0ZWQgd2l0aCBpdC4gIFRoZSBpbml0aWFsIHZhbHVlCi0jIG9mIHRoZSBjb3VudCBpcyBzcGVjaWZpZWQgYnkgdGhlIG9wdGlvbmFsIGFyZ3VtZW50ICh3aGljaCBkZWZhdWx0cyB0bwotIyAxKSBwYXNzZWQgdG8gdGhlIHNlbWFwaG9yZSBjb25zdHJ1Y3Rvci4KLSMKLSMgTWV0aG9kczoKLSMKLSMgICAucCgpCi0jICAgICAgSWYgdGhlIHNlbWFwaG9yZSdzIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiAwLCBkZWNyZW1lbnRzIHRoZSBjb3VudAotIyAgICAgIGJ5IDEgYW5kIHJldHVybnMuCi0jICAgICAgRWxzZSBpZiB0aGUgc2VtYXBob3JlJ3MgY291bnQgaXMgMCwgYmxvY2tzIHRoZSBjYWxsaW5nIHRocmVhZAotIyAgICAgIHVudGlsIGEgc3Vic2VxdWVudCAudigpIGluY3JlYXNlcyB0aGUgY291bnQuICBXaGVuIHRoYXQgaGFwcGVucywKLSMgICAgICB0aGUgY291bnQgd2lsbCBiZSBkZWNyZW1lbnRlZCBieSAxIGFuZCB0aGUgY2FsbGluZyB0aHJlYWQgcmVzdW1lZC4KLSMKLSMgICAudigpCi0jICAgICAgSW5jcmVtZW50cyB0aGUgc2VtYXBob3JlJ3MgY291bnQgYnkgMSwgYW5kIHdha2VzIHVwIGEgdGhyZWFkIChpZgotIyAgICAgIGFueSkgYmxvY2tlZCBieSBhIC5wKCkuICBJdCdzIGFuIChkZXRlY3RlZCkgZXJyb3IgZm9yIGEgLnYoKSB0bwotIyAgICAgIGluY3JlYXNlIHRoZSBzZW1hcGhvcmUncyBjb3VudCB0byBhIHZhbHVlIGxhcmdlciB0aGFuIHRoZSBpbml0aWFsCi0jICAgICAgY291bnQuCi0jCi0jIE1VTFRJUExFLVJFQURFUiBTSU5HTEUtV1JJVEVSIExPQ0tTCi0jCi0jIEEgbXJzdyBsb2NrIGlzIGNyZWF0ZWQgdmlhCi0jICAgaW1wb3J0IHRoaXNfbW9kdWxlCi0jICAgeW91cl9tcnN3X2xvY2sgPSB0aGlzX21vZHVsZS5tcnN3KCkKLSMKLSMgVGhpcyBraW5kIG9mIGxvY2sgaXMgb2Z0ZW4gdXNlZnVsIHdpdGggY29tcGxleCBzaGFyZWQgZGF0YSBzdHJ1Y3R1cmVzLgotIyBUaGUgb2JqZWN0IGxldHMgYW55IG51bWJlciBvZiAicmVhZGVycyIgcHJvY2VlZCwgc28gbG9uZyBhcyBubyB0aHJlYWQKLSMgd2lzaGVzIHRvICJ3cml0ZSIuICBXaGVuIGEgKG9uZSBvciBtb3JlKSB0aHJlYWQgZGVjbGFyZXMgaXRzIGludGVudGlvbgotIyB0byAid3JpdGUiIChlLmcuLCB0byB1cGRhdGUgYSBzaGFyZWQgc3RydWN0dXJlKSwgYWxsIGN1cnJlbnQgcmVhZGVycwotIyBhcmUgYWxsb3dlZCB0byBmaW5pc2gsIGFuZCB0aGVuIGEgd3JpdGVyIGdldHMgZXhjbHVzaXZlIGFjY2VzczsgYWxsCi0jIG90aGVyIHJlYWRlcnMgJiB3cml0ZXJzIGFyZSBibG9ja2VkIHVudGlsIHRoZSBjdXJyZW50IHdyaXRlciBjb21wbGV0ZXMuCi0jIEZpbmFsbHksIGlmIHNvbWUgdGhyZWFkIGlzIHdhaXRpbmcgdG8gd3JpdGUgYW5kIGFub3RoZXIgaXMgd2FpdGluZyB0bwotIyByZWFkLCB0aGUgd3JpdGVyIHRha2VzIHByZWNlZGVuY2UuCi0jCi0jIE1ldGhvZHM6Ci0jCi0jICAgLnJlYWRfaW4oKQotIyAgICAgIElmIG5vIHRocmVhZCBpcyB3cml0aW5nIG9yIHdhaXRpbmcgdG8gd3JpdGUsIHJldHVybnMgaW1tZWRpYXRlbHkuCi0jICAgICAgRWxzZSBibG9ja3MgdW50aWwgbm8gdGhyZWFkIGlzIHdyaXRpbmcgb3Igd2FpdGluZyB0byB3cml0ZS4gIFNvCi0jICAgICAgbG9uZyBhcyBzb21lIHRocmVhZCBoYXMgY29tcGxldGVkIGEgLnJlYWRfaW4gYnV0IG5vdCBhIC5yZWFkX291dCwKLSMgICAgICB3cml0ZXJzIGFyZSBibG9ja2VkLgotIwotIyAgIC5yZWFkX291dCgpCi0jICAgICAgVXNlIHNvbWV0aW1lIGFmdGVyIGEgLnJlYWRfaW4gdG8gZGVjbGFyZSB0aGF0IHRoZSB0aHJlYWQgaXMgZG9uZQotIyAgICAgIHJlYWRpbmcuICBXaGVuIGFsbCB0aHJlYWRzIGNvbXBsZXRlIHJlYWRpbmcsIGEgd3JpdGVyIGNhbiBwcm9jZWVkLgotIwotIyAgIC53cml0ZV9pbigpCi0jICAgICAgSWYgbm8gdGhyZWFkIGlzIHdyaXRpbmcgKGhhcyBjb21wbGV0ZWQgYSAud3JpdGVfaW4sIGJ1dCBoYXNuJ3QgeWV0Ci0jICAgICAgZG9uZSBhIC53cml0ZV9vdXQpIG9yIHJlYWRpbmcgKHNpbWlsYXJseSksIHJldHVybnMgaW1tZWRpYXRlbHkuCi0jICAgICAgRWxzZSBibG9ja3MgdGhlIGNhbGxpbmcgdGhyZWFkLCBhbmQgdGhyZWFkcyB3YWl0aW5nIHRvIHJlYWQsIHVudGlsCi0jICAgICAgdGhlIGN1cnJlbnQgd3JpdGVyIGNvbXBsZXRlcyB3cml0aW5nIG9yIGFsbCB0aGUgY3VycmVudCByZWFkZXJzCi0jICAgICAgY29tcGxldGUgcmVhZGluZzsgaWYgdGhlbiBtb3JlIHRoYW4gb25lIHRocmVhZCBpcyB3YWl0aW5nIHRvCi0jICAgICAgd3JpdGUsIG9uZSBvZiB0aGVtIGlzIGFsbG93ZWQgdG8gcHJvY2VlZCwgYnV0IHdoaWNoIG9uZSBpcyBub3QKLSMgICAgICBzcGVjaWZpZWQuCi0jCi0jICAgLndyaXRlX291dCgpCi0jICAgICAgVXNlIHNvbWV0aW1lIGFmdGVyIGEgLndyaXRlX2luIHRvIGRlY2xhcmUgdGhhdCB0aGUgdGhyZWFkIGlzIGRvbmUKLSMgICAgICB3cml0aW5nLiAgVGhlbiBpZiBzb21lIG90aGVyIHRocmVhZCBpcyB3YWl0aW5nIHRvIHdyaXRlLCBpdCdzCi0jICAgICAgYWxsb3dlZCB0byBwcm9jZWVkLiAgRWxzZSBhbGwgdGhyZWFkcyAoaWYgYW55KSB3YWl0aW5nIHRvIHJlYWQgYXJlCi0jICAgICAgYWxsb3dlZCB0byBwcm9jZWVkLgotIwotIyAgIC53cml0ZV90b19yZWFkKCkKLSMgICAgICBVc2UgaW5zdGVhZCBvZiBhIC53cml0ZV9pbiB0byBkZWNsYXJlIHRoYXQgdGhlIHRocmVhZCBpcyBkb25lCi0jICAgICAgd3JpdGluZyBidXQgd2FudHMgdG8gY29udGludWUgcmVhZGluZyB3aXRob3V0IG90aGVyIHdyaXRlcnMKLSMgICAgICBpbnRlcnZlbmluZy4gIElmIHRoZXJlIGFyZSBvdGhlciB0aHJlYWRzIHdhaXRpbmcgdG8gd3JpdGUsIHRoZXkKLSMgICAgICBhcmUgYWxsb3dlZCB0byBwcm9jZWVkIG9ubHkgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGNhbGxzCi0jICAgICAgLnJlYWRfb3V0OyB0aHJlYWRzIHdhaXRpbmcgdG8gcmVhZCBhcmUgb25seSBhbGxvd2VkIHRvIHByb2NlZWQKLSMgICAgICBpZiB0aGVyZSBhcmUgYXJlIG5vIHRocmVhZHMgd2FpdGluZyB0byB3cml0ZS4gIChUaGlzIGlzIGEKLSMgICAgICB3ZWFrbmVzcyBvZiB0aGUgaW50ZXJmYWNlISkKLQotaW1wb3J0IF90aHJlYWQgYXMgdGhyZWFkCi0KLWNsYXNzIGNvbmRpdGlvbjoKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jaz1Ob25lKToKLSAgICAgICAgIyB0aGUgbG9jayBhY3R1YWxseSB1c2VkIGJ5IC5hY3F1aXJlKCkgYW5kIC5yZWxlYXNlKCkKLSAgICAgICAgaWYgbG9jayBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi5tdXRleCA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGlmIGhhc2F0dHIobG9jaywgJ2FjcXVpcmUnKSBhbmQgXAotICAgICAgICAgICAgICAgaGFzYXR0cihsb2NrLCAncmVsZWFzZScpOgotICAgICAgICAgICAgICAgIHNlbGYubXV0ZXggPSBsb2NrCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignY29uZGl0aW9uIGNvbnN0cnVjdG9yIHJlcXVpcmVzICcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EgbG9jayBhcmd1bWVudCcpCi0KLSAgICAgICAgIyBsb2NrIHVzZWQgdG8gYmxvY2sgdGhyZWFkcyB1bnRpbCBhIHNpZ25hbAotICAgICAgICBzZWxmLmNoZWNrb3V0ID0gdGhyZWFkLmFsbG9jYXRlX2xvY2soKQotICAgICAgICBzZWxmLmNoZWNrb3V0LmFjcXVpcmUoKQotCi0gICAgICAgICMgaW50ZXJuYWwgY3JpdGljYWwtc2VjdGlvbiBsb2NrLCAmIHRoZSBkYXRhIGl0IHByb3RlY3RzCi0gICAgICAgIHNlbGYuaWRsb2NrID0gdGhyZWFkLmFsbG9jYXRlX2xvY2soKQotICAgICAgICBzZWxmLmlkID0gMAotICAgICAgICBzZWxmLndhaXRpbmcgPSAwICAjIG51bSB3YWl0ZXJzIHN1YmplY3QgdG8gY3VycmVudCByZWxlYXNlCi0gICAgICAgIHNlbGYucGVuZGluZyA9IDAgICMgbnVtIHdhaXRlcnMgYXdhaXRpbmcgbmV4dCBzaWduYWwKLSAgICAgICAgc2VsZi50b3JlbGVhc2UgPSAwICAgICAgIyBudW0gd2FpdGVycyB0byByZWxlYXNlCi0gICAgICAgIHNlbGYucmVsZWFzaW5nID0gMCAgICAgICMgMSBpZmYgcmVsZWFzZSBpcyBpbiBwcm9ncmVzcwotCi0gICAgZGVmIGFjcXVpcmUoc2VsZik6Ci0gICAgICAgIHNlbGYubXV0ZXguYWNxdWlyZSgpCi0KLSAgICBkZWYgcmVsZWFzZShzZWxmKToKLSAgICAgICAgc2VsZi5tdXRleC5yZWxlYXNlKCkKLQotICAgIGRlZiB3YWl0KHNlbGYpOgotICAgICAgICBtdXRleCwgY2hlY2tvdXQsIGlkbG9jayA9IHNlbGYubXV0ZXgsIHNlbGYuY2hlY2tvdXQsIHNlbGYuaWRsb2NrCi0gICAgICAgIGlmIG5vdCBtdXRleC5sb2NrZWQoKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNvbmRpdGlvbiBtdXN0IGJlIC5hY3F1aXJlJ2Qgd2hlbiAud2FpdCgpIGludm9rZWQiKQotCi0gICAgICAgIGlkbG9jay5hY3F1aXJlKCkKLSAgICAgICAgbXlpZCA9IHNlbGYuaWQKLSAgICAgICAgc2VsZi5wZW5kaW5nID0gc2VsZi5wZW5kaW5nICsgMQotICAgICAgICBpZGxvY2sucmVsZWFzZSgpCi0KLSAgICAgICAgbXV0ZXgucmVsZWFzZSgpCi0KLSAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgIGNoZWNrb3V0LmFjcXVpcmUoKTsgaWRsb2NrLmFjcXVpcmUoKQotICAgICAgICAgICAgaWYgbXlpZCA8IHNlbGYuaWQ6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGNoZWNrb3V0LnJlbGVhc2UoKTsgaWRsb2NrLnJlbGVhc2UoKQotCi0gICAgICAgIHNlbGYud2FpdGluZyA9IHNlbGYud2FpdGluZyAtIDEKLSAgICAgICAgc2VsZi50b3JlbGVhc2UgPSBzZWxmLnRvcmVsZWFzZSAtIDEKLSAgICAgICAgaWYgc2VsZi50b3JlbGVhc2U6Ci0gICAgICAgICAgICBjaGVja291dC5yZWxlYXNlKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYucmVsZWFzaW5nID0gMAotICAgICAgICAgICAgaWYgc2VsZi53YWl0aW5nID09IHNlbGYucGVuZGluZyA9PSAwOgotICAgICAgICAgICAgICAgIHNlbGYuaWQgPSAwCi0gICAgICAgIGlkbG9jay5yZWxlYXNlKCkKLSAgICAgICAgbXV0ZXguYWNxdWlyZSgpCi0KLSAgICBkZWYgc2lnbmFsKHNlbGYpOgotICAgICAgICBzZWxmLmJyb2FkY2FzdCgxKQotCi0gICAgZGVmIGJyb2FkY2FzdChzZWxmLCBudW0gPSAtMSk6Ci0gICAgICAgIGlmIG51bSA8IC0xOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignLmJyb2FkY2FzdCBjYWxsZWQgd2l0aCBudW0gJXInICUgKG51bSwpKQotICAgICAgICBpZiBudW0gPT0gMDoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmlkbG9jay5hY3F1aXJlKCkKLSAgICAgICAgaWYgc2VsZi5wZW5kaW5nOgotICAgICAgICAgICAgc2VsZi53YWl0aW5nID0gc2VsZi53YWl0aW5nICsgc2VsZi5wZW5kaW5nCi0gICAgICAgICAgICBzZWxmLnBlbmRpbmcgPSAwCi0gICAgICAgICAgICBzZWxmLmlkID0gc2VsZi5pZCArIDEKLSAgICAgICAgaWYgbnVtID09IC0xOgotICAgICAgICAgICAgc2VsZi50b3JlbGVhc2UgPSBzZWxmLndhaXRpbmcKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYudG9yZWxlYXNlID0gbWluKCBzZWxmLndhaXRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b3JlbGVhc2UgKyBudW0gKQotICAgICAgICBpZiBzZWxmLnRvcmVsZWFzZSBhbmQgbm90IHNlbGYucmVsZWFzaW5nOgotICAgICAgICAgICAgc2VsZi5yZWxlYXNpbmcgPSAxCi0gICAgICAgICAgICBzZWxmLmNoZWNrb3V0LnJlbGVhc2UoKQotICAgICAgICBzZWxmLmlkbG9jay5yZWxlYXNlKCkKLQotY2xhc3MgYmFycmllcjoKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbik6Ci0gICAgICAgIHNlbGYubiA9IG4KLSAgICAgICAgc2VsZi50b2dvID0gbgotICAgICAgICBzZWxmLmZ1bGwgPSBjb25kaXRpb24oKQotCi0gICAgZGVmIGVudGVyKHNlbGYpOgotICAgICAgICBmdWxsID0gc2VsZi5mdWxsCi0gICAgICAgIGZ1bGwuYWNxdWlyZSgpCi0gICAgICAgIHNlbGYudG9nbyA9IHNlbGYudG9nbyAtIDEKLSAgICAgICAgaWYgc2VsZi50b2dvOgotICAgICAgICAgICAgZnVsbC53YWl0KCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYudG9nbyA9IHNlbGYubgotICAgICAgICAgICAgZnVsbC5icm9hZGNhc3QoKQotICAgICAgICBmdWxsLnJlbGVhc2UoKQotCi1jbGFzcyBldmVudDoKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuc3RhdGUgID0gMAotICAgICAgICBzZWxmLnBvc3RlZCA9IGNvbmRpdGlvbigpCi0KLSAgICBkZWYgcG9zdChzZWxmKToKLSAgICAgICAgc2VsZi5wb3N0ZWQuYWNxdWlyZSgpCi0gICAgICAgIHNlbGYuc3RhdGUgPSAxCi0gICAgICAgIHNlbGYucG9zdGVkLmJyb2FkY2FzdCgpCi0gICAgICAgIHNlbGYucG9zdGVkLnJlbGVhc2UoKQotCi0gICAgZGVmIGNsZWFyKHNlbGYpOgotICAgICAgICBzZWxmLnBvc3RlZC5hY3F1aXJlKCkKLSAgICAgICAgc2VsZi5zdGF0ZSA9IDAKLSAgICAgICAgc2VsZi5wb3N0ZWQucmVsZWFzZSgpCi0KLSAgICBkZWYgaXNfcG9zdGVkKHNlbGYpOgotICAgICAgICBzZWxmLnBvc3RlZC5hY3F1aXJlKCkKLSAgICAgICAgYW5zd2VyID0gc2VsZi5zdGF0ZQotICAgICAgICBzZWxmLnBvc3RlZC5yZWxlYXNlKCkKLSAgICAgICAgcmV0dXJuIGFuc3dlcgotCi0gICAgZGVmIHdhaXQoc2VsZik6Ci0gICAgICAgIHNlbGYucG9zdGVkLmFjcXVpcmUoKQotICAgICAgICBpZiBub3Qgc2VsZi5zdGF0ZToKLSAgICAgICAgICAgIHNlbGYucG9zdGVkLndhaXQoKQotICAgICAgICBzZWxmLnBvc3RlZC5yZWxlYXNlKCkKLQotY2xhc3Mgc2VtYXBob3JlOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb3VudD0xKToKLSAgICAgICAgaWYgY291bnQgPD0gMDoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3NlbWFwaG9yZSBjb3VudCAlZDsgbXVzdCBiZSA+PSAxJyAlIGNvdW50KQotICAgICAgICBzZWxmLmNvdW50ID0gY291bnQKLSAgICAgICAgc2VsZi5tYXhjb3VudCA9IGNvdW50Ci0gICAgICAgIHNlbGYubm9uemVybyA9IGNvbmRpdGlvbigpCi0KLSAgICBkZWYgcChzZWxmKToKLSAgICAgICAgc2VsZi5ub256ZXJvLmFjcXVpcmUoKQotICAgICAgICB3aGlsZSBzZWxmLmNvdW50ID09IDA6Ci0gICAgICAgICAgICBzZWxmLm5vbnplcm8ud2FpdCgpCi0gICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50IC0gMQotICAgICAgICBzZWxmLm5vbnplcm8ucmVsZWFzZSgpCi0KLSAgICBkZWYgdihzZWxmKToKLSAgICAgICAgc2VsZi5ub256ZXJvLmFjcXVpcmUoKQotICAgICAgICBpZiBzZWxmLmNvdW50ID09IHNlbGYubWF4Y291bnQ6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCcudigpIHRyaWVkIHRvIHJhaXNlIHNlbWFwaG9yZSBjb3VudCBhYm92ZSAnIFwKLSAgICAgICAgICAgICAgICAgICdpbml0aWFsIHZhbHVlICVyJyAlIHNlbGYubWF4Y291bnQpCi0gICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQotICAgICAgICBzZWxmLm5vbnplcm8uc2lnbmFsKCkKLSAgICAgICAgc2VsZi5ub256ZXJvLnJlbGVhc2UoKQotCi1jbGFzcyBtcnN3OgotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgIyBjcml0aWNhbC1zZWN0aW9uIGxvY2sgJiB0aGUgZGF0YSBpdCBwcm90ZWN0cwotICAgICAgICBzZWxmLnJ3T0sgPSB0aHJlYWQuYWxsb2NhdGVfbG9jaygpCi0gICAgICAgIHNlbGYubnIgPSAwICAjIG51bWJlciByZWFkZXJzIGFjdGl2ZWx5IHJlYWRpbmcgKG5vdCBqdXN0IHdhaXRpbmcpCi0gICAgICAgIHNlbGYubncgPSAwICAjIG51bWJlciB3cml0ZXJzIGVpdGhlciB3YWl0aW5nIHRvIHdyaXRlIG9yIHdyaXRpbmcKLSAgICAgICAgc2VsZi53cml0aW5nID0gMCAgIyAxIGlmZiBzb21lIHRocmVhZCBpcyB3cml0aW5nCi0KLSAgICAgICAgIyBjb25kaXRpb25zCi0gICAgICAgIHNlbGYucmVhZE9LICA9IGNvbmRpdGlvbihzZWxmLnJ3T0spICAjIE9LIHRvIHVuYmxvY2sgcmVhZGVycwotICAgICAgICBzZWxmLndyaXRlT0sgPSBjb25kaXRpb24oc2VsZi5yd09LKSAgIyBPSyB0byB1bmJsb2NrIHdyaXRlcnMKLQotICAgIGRlZiByZWFkX2luKHNlbGYpOgotICAgICAgICBzZWxmLnJ3T0suYWNxdWlyZSgpCi0gICAgICAgIHdoaWxlIHNlbGYubnc6Ci0gICAgICAgICAgICBzZWxmLnJlYWRPSy53YWl0KCkKLSAgICAgICAgc2VsZi5uciA9IHNlbGYubnIgKyAxCi0gICAgICAgIHNlbGYucndPSy5yZWxlYXNlKCkKLQotICAgIGRlZiByZWFkX291dChzZWxmKToKLSAgICAgICAgc2VsZi5yd09LLmFjcXVpcmUoKQotICAgICAgICBpZiBzZWxmLm5yIDw9IDA6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCcucmVhZF9vdXQoKSBpbnZva2VkIHdpdGhvdXQgYW4gYWN0aXZlIHJlYWRlcicpCi0gICAgICAgIHNlbGYubnIgPSBzZWxmLm5yIC0gMQotICAgICAgICBpZiBzZWxmLm5yID09IDA6Ci0gICAgICAgICAgICBzZWxmLndyaXRlT0suc2lnbmFsKCkKLSAgICAgICAgc2VsZi5yd09LLnJlbGVhc2UoKQotCi0gICAgZGVmIHdyaXRlX2luKHNlbGYpOgotICAgICAgICBzZWxmLnJ3T0suYWNxdWlyZSgpCi0gICAgICAgIHNlbGYubncgPSBzZWxmLm53ICsgMQotICAgICAgICB3aGlsZSBzZWxmLndyaXRpbmcgb3Igc2VsZi5ucjoKLSAgICAgICAgICAgIHNlbGYud3JpdGVPSy53YWl0KCkKLSAgICAgICAgc2VsZi53cml0aW5nID0gMQotICAgICAgICBzZWxmLnJ3T0sucmVsZWFzZSgpCi0KLSAgICBkZWYgd3JpdGVfb3V0KHNlbGYpOgotICAgICAgICBzZWxmLnJ3T0suYWNxdWlyZSgpCi0gICAgICAgIGlmIG5vdCBzZWxmLndyaXRpbmc6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCcud3JpdGVfb3V0KCkgaW52b2tlZCB3aXRob3V0IGFuIGFjdGl2ZSB3cml0ZXInKQotICAgICAgICBzZWxmLndyaXRpbmcgPSAwCi0gICAgICAgIHNlbGYubncgPSBzZWxmLm53IC0gMQotICAgICAgICBpZiBzZWxmLm53OgotICAgICAgICAgICAgc2VsZi53cml0ZU9LLnNpZ25hbCgpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnJlYWRPSy5icm9hZGNhc3QoKQotICAgICAgICBzZWxmLnJ3T0sucmVsZWFzZSgpCi0KLSAgICBkZWYgd3JpdGVfdG9fcmVhZChzZWxmKToKLSAgICAgICAgc2VsZi5yd09LLmFjcXVpcmUoKQotICAgICAgICBpZiBub3Qgc2VsZi53cml0aW5nOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignLndyaXRlX3RvX3JlYWQoKSBpbnZva2VkIHdpdGhvdXQgYW4gYWN0aXZlIHdyaXRlcicpCi0gICAgICAgIHNlbGYud3JpdGluZyA9IDAKLSAgICAgICAgc2VsZi5udyA9IHNlbGYubncgLSAxCi0gICAgICAgIHNlbGYubnIgPSBzZWxmLm5yICsgMQotICAgICAgICBpZiBub3Qgc2VsZi5udzoKLSAgICAgICAgICAgIHNlbGYucmVhZE9LLmJyb2FkY2FzdCgpCi0gICAgICAgIHNlbGYucndPSy5yZWxlYXNlKCkKLQotIyBUaGUgcmVzdCBvZiB0aGUgZmlsZSBpcyBhIHRlc3QgY2FzZSwgdGhhdCBydW5zIGEgbnVtYmVyIG9mIHBhcmFsbGVsaXplZAotIyBxdWlja3NvcnRzIGluIHBhcmFsbGVsLiAgSWYgaXQgd29ya3MsIHlvdSdsbCBnZXQgYWJvdXQgNjAwIGxpbmVzIG9mCi0jIHRyYWNpbmcgb3V0cHV0LCB3aXRoIGEgbGluZSBsaWtlCi0jICAgICB0ZXN0IHBhc3NlZCEgMjA5IHRocmVhZHMgY3JlYXRlZCBpbiBhbGwKLSMgYXMgdGhlIGxhc3QgbGluZS4gIFRoZSBjb250ZW50IGFuZCBvcmRlciBvZiBwcmVjZWRpbmcgbGluZXMgd2lsbAotIyB2YXJ5IGFjcm9zcyBydW5zLgotCi1kZWYgX25ld190aHJlYWQoZnVuYywgKmFyZ3MpOgotICAgIGdsb2JhbCBUSUQKLSAgICB0aWQuYWNxdWlyZSgpOyBpZCA9IFRJRCA9IFRJRCsxOyB0aWQucmVsZWFzZSgpCi0gICAgaW8uYWNxdWlyZSgpOyBhbGl2ZS5hcHBlbmQoaWQpOyBcCi0gICAgICAgICAgICAgICAgICBwcmludCgnc3RhcnRpbmcgdGhyZWFkJywgaWQsICctLScsIGxlbihhbGl2ZSksICdhbGl2ZScpOyBcCi0gICAgICAgICAgICAgICAgICBpby5yZWxlYXNlKCkKLSAgICB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCggZnVuYywgKGlkLCkgKyBhcmdzICkKLQotZGVmIF9xc29ydCh0aWQsIGEsIGwsIHIsIGZpbmlzaGVkKToKLSAgICAjIHNvcnQgYVtsOnJdOyBwb3N0IGZpbmlzaGVkIHdoZW4gZG9uZQotICAgIGlvLmFjcXVpcmUoKTsgcHJpbnQoJ3RocmVhZCcsIHRpZCwgJ3Fzb3J0JywgbCwgcik7IGlvLnJlbGVhc2UoKQotICAgIGlmIHItbCA+IDE6Ci0gICAgICAgIHBpdm90ID0gYVtsXQotICAgICAgICBqID0gbCsxICAgIyBtYWtlIGFbbDpqXSA8PSBwaXZvdCwgYW5kIGFbajpyXSA+IHBpdm90Ci0gICAgICAgIGZvciBpIGluIHJhbmdlKGosIHIpOgotICAgICAgICAgICAgaWYgYVtpXSA8PSBwaXZvdDoKLSAgICAgICAgICAgICAgICBhW2pdLCBhW2ldID0gYVtpXSwgYVtqXQotICAgICAgICAgICAgICAgIGogPSBqICsgMQotICAgICAgICBhW2xdLCBhW2otMV0gPSBhW2otMV0sIHBpdm90Ci0KLSAgICAgICAgbF9zdWJhcnJheV9zb3J0ZWQgPSBldmVudCgpCi0gICAgICAgIHJfc3ViYXJyYXlfc29ydGVkID0gZXZlbnQoKQotICAgICAgICBfbmV3X3RocmVhZChfcXNvcnQsIGEsIGwsIGotMSwgbF9zdWJhcnJheV9zb3J0ZWQpCi0gICAgICAgIF9uZXdfdGhyZWFkKF9xc29ydCwgYSwgaiwgciwgICByX3N1YmFycmF5X3NvcnRlZCkKLSAgICAgICAgbF9zdWJhcnJheV9zb3J0ZWQud2FpdCgpCi0gICAgICAgIHJfc3ViYXJyYXlfc29ydGVkLndhaXQoKQotCi0gICAgaW8uYWNxdWlyZSgpOyBwcmludCgndGhyZWFkJywgdGlkLCAncXNvcnQgZG9uZScpOyBcCi0gICAgICAgICAgICAgICAgICBhbGl2ZS5yZW1vdmUodGlkKTsgaW8ucmVsZWFzZSgpCi0gICAgZmluaXNoZWQucG9zdCgpCi0KLWRlZiBfcmFuZGFycmF5KHRpZCwgYSwgZmluaXNoZWQpOgotICAgIGlvLmFjcXVpcmUoKTsgcHJpbnQoJ3RocmVhZCcsIHRpZCwgJ3JhbmRvbWl6aW5nIGFycmF5Jyk7IFwKLSAgICAgICAgICAgICAgICAgIGlvLnJlbGVhc2UoKQotICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihhKSk6Ci0gICAgICAgIHdoLmFjcXVpcmUoKTsgaiA9IHJhbmRpbnQoMCxpKTsgd2gucmVsZWFzZSgpCi0gICAgICAgIGFbaV0sIGFbal0gPSBhW2pdLCBhW2ldCi0gICAgaW8uYWNxdWlyZSgpOyBwcmludCgndGhyZWFkJywgdGlkLCAncmFuZG9taXppbmcgZG9uZScpOyBcCi0gICAgICAgICAgICAgICAgICBhbGl2ZS5yZW1vdmUodGlkKTsgaW8ucmVsZWFzZSgpCi0gICAgZmluaXNoZWQucG9zdCgpCi0KLWRlZiBfY2hlY2tfc29ydChhKToKLSAgICBpZiBhICE9IHJhbmdlKGxlbihhKSk6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2Egbm90IHNvcnRlZCcsIGEpCi0KLWRlZiBfcnVuX29uZV9zb3J0KHRpZCwgYSwgYmFyLCBkb25lKToKLSAgICAjIHJhbmRvbWl6ZSBhLCBhbmQgcXVpY2tzb3J0IGl0Ci0gICAgIyBmb3IgdmFyaWV0eSwgYWxsIHRoZSB0aHJlYWRzIHJ1bm5pbmcgdGhpcyBlbnRlciBhIGJhcnJpZXIKLSAgICAjIGF0IHRoZSBlbmQsIGFuZCBwb3N0IGBkb25lJyBhZnRlciB0aGUgYmFycmllciBleGl0cwotICAgIGlvLmFjcXVpcmUoKTsgcHJpbnQoJ3RocmVhZCcsIHRpZCwgJ3JhbmRvbWl6aW5nJywgYSk7IFwKLSAgICAgICAgICAgICAgICAgIGlvLnJlbGVhc2UoKQotICAgIGZpbmlzaGVkID0gZXZlbnQoKQotICAgIF9uZXdfdGhyZWFkKF9yYW5kYXJyYXksIGEsIGZpbmlzaGVkKQotICAgIGZpbmlzaGVkLndhaXQoKQotCi0gICAgaW8uYWNxdWlyZSgpOyBwcmludCgndGhyZWFkJywgdGlkLCAnc29ydGluZycsIGEpOyBpby5yZWxlYXNlKCkKLSAgICBmaW5pc2hlZC5jbGVhcigpCi0gICAgX25ld190aHJlYWQoX3Fzb3J0LCBhLCAwLCBsZW4oYSksIGZpbmlzaGVkKQotICAgIGZpbmlzaGVkLndhaXQoKQotICAgIF9jaGVja19zb3J0KGEpCi0KLSAgICBpby5hY3F1aXJlKCk7IHByaW50KCd0aHJlYWQnLCB0aWQsICdlbnRlcmluZyBiYXJyaWVyJyk7IFwKLSAgICAgICAgICAgICAgICAgIGlvLnJlbGVhc2UoKQotICAgIGJhci5lbnRlcigpCi0gICAgaW8uYWNxdWlyZSgpOyBwcmludCgndGhyZWFkJywgdGlkLCAnbGVhdmluZyBiYXJyaWVyJyk7IFwKLSAgICAgICAgICAgICAgICAgIGlvLnJlbGVhc2UoKQotICAgIGlvLmFjcXVpcmUoKTsgYWxpdmUucmVtb3ZlKHRpZCk7IGlvLnJlbGVhc2UoKQotICAgIGJhci5lbnRlcigpICMgbWFrZSBzdXJlIHRoZXkndmUgYWxsIHJlbW92ZWQgdGhlbXNlbHZlcyBmcm9tIGFsaXZlCi0gICAgICAgICAgICAgICAgIyMgIGJlZm9yZSAnZG9uZScgaXMgcG9zdGVkCi0gICAgYmFyLmVudGVyKCkgIyBqdXN0IHRvIGJlIGNydWVsCi0gICAgZG9uZS5wb3N0KCkKLQotZGVmIHRlc3QoKToKLSAgICBnbG9iYWwgVElELCB0aWQsIGlvLCB3aCwgcmFuZGludCwgYWxpdmUKLSAgICBpbXBvcnQgcmFuZG9tCi0gICAgcmFuZGludCA9IHJhbmRvbS5yYW5kaW50Ci0KLSAgICBUSUQgPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRocmVhZCBJRCAoMSwgMiwgLi4uKQotICAgIHRpZCA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkgICAgICAgICMgZm9yIGNoYW5naW5nIFRJRAotICAgIGlvICA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkgICAgICAgICMgZm9yIHByaW50aW5nLCBhbmQgJ2FsaXZlJwotICAgIHdoICA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkgICAgICAgICMgZm9yIGNhbGxzIHRvIHJhbmRvbQotICAgIGFsaXZlID0gW10gICAgICAgICAgICAgICAgICAgICAgICAgICMgSURzIG9mIGFjdGl2ZSB0aHJlYWRzCi0KLSAgICBOU09SVFMgPSA1Ci0gICAgYXJyYXlzID0gW10KLSAgICBmb3IgaSBpbiByYW5nZShOU09SVFMpOgotICAgICAgICBhcnJheXMuYXBwZW5kKCByYW5nZSggKGkrMSkqMTAgKSApCi0KLSAgICBiYXIgPSBiYXJyaWVyKE5TT1JUUykKLSAgICBmaW5pc2hlZCA9IGV2ZW50KCkKLSAgICBmb3IgaSBpbiByYW5nZShOU09SVFMpOgotICAgICAgICBfbmV3X3RocmVhZChfcnVuX29uZV9zb3J0LCBhcnJheXNbaV0sIGJhciwgZmluaXNoZWQpCi0gICAgZmluaXNoZWQud2FpdCgpCi0KLSAgICBwcmludCgnYWxsIHRocmVhZHMgZG9uZSwgYW5kIGNoZWNraW5nIHJlc3VsdHMgLi4uJykKLSAgICBpZiBhbGl2ZToKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndGhyZWFkcyBzdGlsbCBhbGl2ZSBhdCBlbmQnLCBhbGl2ZSkKLSAgICBmb3IgaSBpbiByYW5nZShOU09SVFMpOgotICAgICAgICBhID0gYXJyYXlzW2ldCi0gICAgICAgIGlmIGxlbihhKSAhPSAoaSsxKSoxMDoKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xlbmd0aCBvZiBhcnJheScsIGksICdzY3Jld2VkIHVwJykKLSAgICAgICAgX2NoZWNrX3NvcnQoYSkKLQotICAgIHByaW50KCd0ZXN0IHBhc3NlZCEnLCBUSUQsICd0aHJlYWRzIGNyZWF0ZWQgaW4gYWxsJykKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB0ZXN0KCkKLQotIyBlbmQgb2YgbW9kdWxlCmRpZmYgLS1naXQgYS9EZW1vL3RocmVhZHMvdGVsbmV0LnB5IGIvRGVtby90aHJlYWRzL3RlbG5ldC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlNDkwNS4uMDAwMDAwMAotLS0gYS9EZW1vL3RocmVhZHMvdGVsbmV0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLSMgTWluaW1hbCBpbnRlcmZhY2UgdG8gdGhlIEludGVybmV0IHRlbG5ldCBwcm90b2NvbC4KLSMKLSMgKioqIG1vZGlmaWVkIHRvIHVzZSB0aHJlYWRzICoqKgotIwotIyBJdCByZWZ1c2VzIGFsbCB0ZWxuZXQgb3B0aW9ucyBhbmQgZG9lcyBub3QgcmVjb2duaXplIGFueSBvZiB0aGUgb3RoZXIKLSMgdGVsbmV0IGNvbW1hbmRzLCBidXQgY2FuIHN0aWxsIGJlIHVzZWQgdG8gY29ubmVjdCBpbiBsaW5lLWJ5LWxpbmUgbW9kZS4KLSMgSXQncyBhbHNvIHVzZWZ1bCB0byBwbGF5IHdpdGggYSBudW1iZXIgb2Ygb3RoZXIgc2VydmljZXMsCi0jIGxpa2UgdGltZSwgZmluZ2VyLCBzbXRwIGFuZCBldmVuIGZ0cC4KLSMKLSMgVXNhZ2U6IHRlbG5ldCBob3N0IFtwb3J0XQotIwotIyBUaGUgcG9ydCBtYXkgYmUgYSBzZXJ2aWNlIG5hbWUgb3IgYSBkZWNpbWFsIHBvcnQgbnVtYmVyOwotIyBpdCBkZWZhdWx0cyB0byAndGVsbmV0Jy4KLQotCi1pbXBvcnQgc3lzLCBvcywgdGltZQotZnJvbSBzb2NrZXQgaW1wb3J0ICoKLWltcG9ydCBfdGhyZWFkIGFzIHRocmVhZAotCi1CVUZTSVpFID0gOCoxMDI0Ci0KLSMgVGVsbmV0IHByb3RvY29sIGNoYXJhY3RlcnMKLQotSUFDICA9IGNocigyNTUpICMgSW50ZXJwcmV0IGFzIGNvbW1hbmQKLURPTlQgPSBjaHIoMjU0KQotRE8gICA9IGNocigyNTMpCi1XT05UID0gY2hyKDI1MikKLVdJTEwgPSBjaHIoMjUxKQotCi1kZWYgbWFpbigpOgotICAgIGlmIGxlbihzeXMuYXJndikgPCAyOgotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCd1c2FnZTogdGVsbmV0IGhvc3RuYW1lIFtwb3J0XVxuJykKLSAgICAgICAgc3lzLmV4aXQoMikKLSAgICBob3N0ID0gc3lzLmFyZ3ZbMV0KLSAgICB0cnk6Ci0gICAgICAgIGhvc3RhZGRyID0gZ2V0aG9zdGJ5bmFtZShob3N0KQotICAgIGV4Y2VwdCBlcnJvcjoKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZShzeXMuYXJndlsxXSArICc6IGJhZCBob3N0IG5hbWVcbicpCi0gICAgICAgIHN5cy5leGl0KDIpCi0gICAgIwotICAgIGlmIGxlbihzeXMuYXJndikgPiAyOgotICAgICAgICBzZXJ2bmFtZSA9IHN5cy5hcmd2WzJdCi0gICAgZWxzZToKLSAgICAgICAgc2Vydm5hbWUgPSAndGVsbmV0JwotICAgICMKLSAgICBpZiAnMCcgPD0gc2Vydm5hbWVbOjFdIDw9ICc5JzoKLSAgICAgICAgcG9ydCA9IGV2YWwoc2Vydm5hbWUpCi0gICAgZWxzZToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcG9ydCA9IGdldHNlcnZieW5hbWUoc2Vydm5hbWUsICd0Y3AnKQotICAgICAgICBleGNlcHQgZXJyb3I6Ci0gICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHNlcnZuYW1lICsgJzogYmFkIHRjcCBzZXJ2aWNlIG5hbWVcbicpCi0gICAgICAgICAgICBzeXMuZXhpdCgyKQotICAgICMKLSAgICBzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNKQotICAgICMKLSAgICB0cnk6Ci0gICAgICAgIHMuY29ubmVjdCgoaG9zdCwgcG9ydCkpCi0gICAgZXhjZXB0IGVycm9yIGFzIG1zZzoKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnY29ubmVjdCBmYWlsZWQ6ICVyXG4nICUgKG1zZywpKQotICAgICAgICBzeXMuZXhpdCgxKQotICAgICMKLSAgICB0aHJlYWQuc3RhcnRfbmV3KGNoaWxkLCAocywpKQotICAgIHBhcmVudChzKQotCi1kZWYgcGFyZW50KHMpOgotICAgICMgcmVhZCBzb2NrZXQsIHdyaXRlIHN0ZG91dAotICAgIGlhYyA9IDAgICAgICAgICAjIEludGVycHJldCBuZXh0IGNoYXIgYXMgY29tbWFuZAotICAgIG9wdCA9ICcnICAgICAgICAjIEludGVycHJldCBuZXh0IGNoYXIgYXMgb3B0aW9uCi0gICAgd2hpbGUgMToKLSAgICAgICAgZGF0YSwgZHVtbXkgPSBzLnJlY3Zmcm9tKEJVRlNJWkUpCi0gICAgICAgIGlmIG5vdCBkYXRhOgotICAgICAgICAgICAgIyBFT0YgLS0gZXhpdAotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggJyhDbG9zZWQgYnkgcmVtb3RlIGhvc3QpXG4nKQotICAgICAgICAgICAgc3lzLmV4aXQoMSkKLSAgICAgICAgY2xlYW5kYXRhID0gJycKLSAgICAgICAgZm9yIGMgaW4gZGF0YToKLSAgICAgICAgICAgIGlmIG9wdDoKLSAgICAgICAgICAgICAgICBwcmludChvcmQoYykpCi0jIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICcocmVwbHlpbmc6ICVyKScgJSAob3B0K2MsKQotICAgICAgICAgICAgICAgIHMuc2VuZChvcHQgKyBjKQotICAgICAgICAgICAgICAgIG9wdCA9ICcnCi0gICAgICAgICAgICBlbGlmIGlhYzoKLSAgICAgICAgICAgICAgICBpYWMgPSAwCi0gICAgICAgICAgICAgICAgaWYgYyA9PSBJQUM6Ci0gICAgICAgICAgICAgICAgICAgIGNsZWFuZGF0YSA9IGNsZWFuZGF0YSArIGMKLSAgICAgICAgICAgICAgICBlbGlmIGMgaW4gKERPLCBET05UKToKLSAgICAgICAgICAgICAgICAgICAgaWYgYyA9PSBETzogcHJpbnQoJyhETyknLCBlbmQ9JyAnKQotICAgICAgICAgICAgICAgICAgICBlbHNlOiBwcmludCgnKERPTlQpJywgZW5kPScgJykKLSAgICAgICAgICAgICAgICAgICAgb3B0ID0gSUFDICsgV09OVAotICAgICAgICAgICAgICAgIGVsaWYgYyBpbiAoV0lMTCwgV09OVCk6Ci0gICAgICAgICAgICAgICAgICAgIGlmIGMgPT0gV0lMTDogcHJpbnQoJyhXSUxMKScsIGVuZD0nICcpCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6IHByaW50KCcoV09OVCknLCBlbmQ9JyAnKQotICAgICAgICAgICAgICAgICAgICBvcHQgPSBJQUMgKyBET05UCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoJyhjb21tYW5kKScsIG9yZChjKSkKLSAgICAgICAgICAgIGVsaWYgYyA9PSBJQUM6Ci0gICAgICAgICAgICAgICAgaWFjID0gMQotICAgICAgICAgICAgICAgIHByaW50KCcoSUFDKScsIGVuZD0nICcpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGNsZWFuZGF0YSA9IGNsZWFuZGF0YSArIGMKLSAgICAgICAgc3lzLnN0ZG91dC53cml0ZShjbGVhbmRhdGEpCi0gICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotIyMgICAgICAgICAgICAgIHByaW50ICdPdXQ6JywgcmVwcihjbGVhbmRhdGEpCi0KLWRlZiBjaGlsZChzKToKLSAgICAjIHJlYWQgc3RkaW4sIHdyaXRlIHNvY2tldAotICAgIHdoaWxlIDE6Ci0gICAgICAgIGxpbmUgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQotIyMgICAgICAgICAgICAgIHByaW50ICdHb3Q6JywgcmVwcihsaW5lKQotICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKLSAgICAgICAgcy5zZW5kKGxpbmUpCi0KLW1haW4oKQpkaWZmIC0tZ2l0IGEvRGVtby94bWwvZWxlbV9jb3VudC5weSBiL0RlbW8veG1sL2VsZW1fY291bnQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZDZjYTkuLjAwMDAwMDAKLS0tIGEvRGVtby94bWwvZWxlbV9jb3VudC5weQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSIiIgotQSBzaW1wbGUgZGVtbyB0aGF0IHJlYWRzIGluIGFuIFhNTCBkb2N1bWVudCBhbmQgZGlzcGxheXMgdGhlIG51bWJlciBvZgotZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXMgd2VsbCBhcyBhIHRhbGx5IG9mIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGJ5IG5hbWUuCi0iIiIKLQotaW1wb3J0IHN5cwotZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKLQotZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlciwgaGFuZGxlcgotCi1jbGFzcyBGYW5jeUNvdW50ZXIoaGFuZGxlci5Db250ZW50SGFuZGxlcik6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuX2VsZW1zID0gMAotICAgICAgICBzZWxmLl9hdHRycyA9IDAKLSAgICAgICAgc2VsZi5fZWxlbV90eXBlcyA9IGRlZmF1bHRkaWN0KGludCkKLSAgICAgICAgc2VsZi5fYXR0cl90eXBlcyA9IGRlZmF1bHRkaWN0KGludCkKLQotICAgIGRlZiBzdGFydEVsZW1lbnQoc2VsZiwgbmFtZSwgYXR0cnMpOgotICAgICAgICBzZWxmLl9lbGVtcyArPSAxCi0gICAgICAgIHNlbGYuX2F0dHJzICs9IGxlbihhdHRycykKLSAgICAgICAgc2VsZi5fZWxlbV90eXBlc1tuYW1lXSArPSAxCi0KLSAgICAgICAgZm9yIG5hbWUgaW4gYXR0cnMua2V5cygpOgotICAgICAgICAgICAgc2VsZi5fYXR0cl90eXBlc1tuYW1lXSArPSAxCi0KLSAgICBkZWYgZW5kRG9jdW1lbnQoc2VsZik6Ci0gICAgICAgIHByaW50KCJUaGVyZSB3ZXJlIiwgc2VsZi5fZWxlbXMsICJlbGVtZW50cy4iKQotICAgICAgICBwcmludCgiVGhlcmUgd2VyZSIsIHNlbGYuX2F0dHJzLCAiYXR0cmlidXRlcy4iKQotCi0gICAgICAgIHByaW50KCItLS1FTEVNRU5UIFRZUEVTIikKLSAgICAgICAgZm9yIHBhaXIgaW4gIHNlbGYuX2VsZW1fdHlwZXMuaXRlbXMoKToKLSAgICAgICAgICAgIHByaW50KCIlMjBzICVkIiAlIHBhaXIpCi0KLSAgICAgICAgcHJpbnQoIi0tLUFUVFJJQlVURSBUWVBFUyIpCi0gICAgICAgIGZvciBwYWlyIGluICBzZWxmLl9hdHRyX3R5cGVzLml0ZW1zKCk6Ci0gICAgICAgICAgICBwcmludCgiJTIwcyAlZCIgJSBwYWlyKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHBhcnNlciA9IG1ha2VfcGFyc2VyKCkKLSAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoRmFuY3lDb3VudGVyKCkpCi0gICAgcGFyc2VyLnBhcnNlKHN5cy5hcmd2WzFdKQpkaWZmIC0tZ2l0IGEvRGVtby94bWwvcm91bmR0cmlwLnB5IGIvRGVtby94bWwvcm91bmR0cmlwLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDFjMDA5Li4wMDAwMDAwCi0tLSBhL0RlbW8veG1sL3JvdW5kdHJpcC5weQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSIiIgotQSBzaW1wbGUgZGVtbyB0aGF0IHJlYWRzIGluIGFuIFhNTCBkb2N1bWVudCBhbmQgc3BpdHMgb3V0IGFuIGVxdWl2YWxlbnQsCi1idXQgbm90IG5lY2Vzc2FyaWx5IGlkZW50aWNhbCwgZG9jdW1lbnQuCi0iIiIKLQotaW1wb3J0IHN5cwotCi1mcm9tIHhtbC5zYXggaW1wb3J0IHNheHV0aWxzLCBoYW5kbGVyLCBtYWtlX3BhcnNlcgotCi0jIC0tLSBUaGUgQ29udGVudEhhbmRsZXIKLQotY2xhc3MgQ29udGVudEdlbmVyYXRvcihoYW5kbGVyLkNvbnRlbnRIYW5kbGVyKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvdXQ9c3lzLnN0ZG91dCk6Ci0gICAgICAgIGhhbmRsZXIuQ29udGVudEhhbmRsZXIuX19pbml0X18oc2VsZikKLSAgICAgICAgc2VsZi5fb3V0ID0gb3V0Ci0KLSAgICAjIENvbnRlbnRIYW5kbGVyIG1ldGhvZHMKLQotICAgIGRlZiBzdGFydERvY3VtZW50KHNlbGYpOgotICAgICAgICBzZWxmLl9vdXQud3JpdGUoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz5cbicpCi0KLSAgICBkZWYgc3RhcnRFbGVtZW50KHNlbGYsIG5hbWUsIGF0dHJzKToKLSAgICAgICAgc2VsZi5fb3V0LndyaXRlKCc8JyArIG5hbWUpCi0gICAgICAgIGZvciAobmFtZSwgdmFsdWUpIGluIGF0dHJzLml0ZW1zKCk6Ci0gICAgICAgICAgICBzZWxmLl9vdXQud3JpdGUoJyAlcz0iJXMiJyAlIChuYW1lLCBzYXh1dGlscy5lc2NhcGUodmFsdWUpKSkKLSAgICAgICAgc2VsZi5fb3V0LndyaXRlKCc+JykKLQotICAgIGRlZiBlbmRFbGVtZW50KHNlbGYsIG5hbWUpOgotICAgICAgICBzZWxmLl9vdXQud3JpdGUoJzwvJXM+JyAlIG5hbWUpCi0KLSAgICBkZWYgY2hhcmFjdGVycyhzZWxmLCBjb250ZW50KToKLSAgICAgICAgc2VsZi5fb3V0LndyaXRlKHNheHV0aWxzLmVzY2FwZShjb250ZW50KSkKLQotICAgIGRlZiBpZ25vcmFibGVXaGl0ZXNwYWNlKHNlbGYsIGNvbnRlbnQpOgotICAgICAgICBzZWxmLl9vdXQud3JpdGUoY29udGVudCkKLQotICAgIGRlZiBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oc2VsZiwgdGFyZ2V0LCBkYXRhKToKLSAgICAgICAgc2VsZi5fb3V0LndyaXRlKCc8PyVzICVzPz4nICUgKHRhcmdldCwgZGF0YSkpCi0KLSMgLS0tIFRoZSBtYWluIHByb2dyYW0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBwYXJzZXIgPSBtYWtlX3BhcnNlcigpCi0gICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKENvbnRlbnRHZW5lcmF0b3IoKSkKLSAgICBwYXJzZXIucGFyc2Uoc3lzLmFyZ3ZbMV0pCmRpZmYgLS1naXQgYS9EZW1vL3htbC9yc3MyaHRtbC5weSBiL0RlbW8veG1sL3JzczJodG1sLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWNkMTU0Li4wMDAwMDAwCi0tLSBhL0RlbW8veG1sL3JzczJodG1sLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotIiIiCi1BIGRlbW8gdGhhdCByZWFkcyBpbiBhbiBSU1MgWE1MIGRvY3VtZW50IGFuZCBlbWl0cyBhbiBIVE1MIGZpbGUgY29udGFpbmluZwotYSBsaXN0IG9mIHRoZSBpbmRpdmlkdWFsIGl0ZW1zIGluIHRoZSBmZWVkLgotIiIiCi0KLWltcG9ydCBzeXMKLWltcG9ydCBjb2RlY3MKLQotZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlciwgaGFuZGxlcgotCi0jIC0tLSBUZW1wbGF0ZXMKLQotdG9wID0gIiIiXAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci0gIDx0aXRsZT4lczwvdGl0bGU+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLTwvaGVhZD4KLQotPGJvZHk+Ci08aDE+JXM8L2gxPgotIiIiCi0KLWJvdHRvbSA9ICIiIgotPC91bD4KLQotPGhyPgotPGFkZHJlc3M+Ci1Db252ZXJ0ZWQgdG8gSFRNTCBieSByc3MyaHRtbC5weS4KLTwvYWRkcmVzcz4KLQotPC9ib2R5PgotPC9odG1sPgotIiIiCi0KLSMgLS0tIFRoZSBDb250ZW50SGFuZGxlcgotCi1jbGFzcyBSU1NIYW5kbGVyKGhhbmRsZXIuQ29udGVudEhhbmRsZXIpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG91dD1zeXMuc3Rkb3V0KToKLSAgICAgICAgaGFuZGxlci5Db250ZW50SGFuZGxlci5fX2luaXRfXyhzZWxmKQotICAgICAgICBzZWxmLl9vdXQgPSBvdXQKLQotICAgICAgICBzZWxmLl90ZXh0ID0gIiIKLSAgICAgICAgc2VsZi5fcGFyZW50ID0gTm9uZQotICAgICAgICBzZWxmLl9saXN0X3N0YXJ0ZWQgPSBGYWxzZQotICAgICAgICBzZWxmLl90aXRsZSA9IE5vbmUKLSAgICAgICAgc2VsZi5fbGluayA9IE5vbmUKLSAgICAgICAgc2VsZi5fZGVzY3IgPSAiIgotCi0gICAgIyBDb250ZW50SGFuZGxlciBtZXRob2RzCi0KLSAgICBkZWYgc3RhcnRFbGVtZW50KHNlbGYsIG5hbWUsIGF0dHJzKToKLSAgICAgICAgaWYgbmFtZSA9PSAiY2hhbm5lbCIgb3IgbmFtZSA9PSAiaW1hZ2UiIG9yIG5hbWUgPT0gIml0ZW0iOgotICAgICAgICAgICAgc2VsZi5fcGFyZW50ID0gbmFtZQotCi0gICAgICAgIHNlbGYuX3RleHQgPSAiIgotCi0gICAgZGVmIGVuZEVsZW1lbnQoc2VsZiwgbmFtZSk6Ci0gICAgICAgIGlmIHNlbGYuX3BhcmVudCA9PSAiY2hhbm5lbCI6Ci0gICAgICAgICAgICBpZiBuYW1lID09ICJ0aXRsZSI6Ci0gICAgICAgICAgICAgICAgc2VsZi5fb3V0LndyaXRlKHRvcCAlIChzZWxmLl90ZXh0LCBzZWxmLl90ZXh0KSkKLSAgICAgICAgICAgIGVsaWYgbmFtZSA9PSAiZGVzY3JpcHRpb24iOgotICAgICAgICAgICAgICAgIHNlbGYuX291dC53cml0ZSgiPHA+JXM8L3A+XG4iICUgc2VsZi5fdGV4dCkKLQotICAgICAgICBlbGlmIHNlbGYuX3BhcmVudCA9PSAiaXRlbSI6Ci0gICAgICAgICAgICBpZiBuYW1lID09ICJ0aXRsZSI6Ci0gICAgICAgICAgICAgICAgc2VsZi5fdGl0bGUgPSBzZWxmLl90ZXh0Ci0gICAgICAgICAgICBlbGlmIG5hbWUgPT0gImxpbmsiOgotICAgICAgICAgICAgICAgIHNlbGYuX2xpbmsgPSBzZWxmLl90ZXh0Ci0gICAgICAgICAgICBlbGlmIG5hbWUgPT0gImRlc2NyaXB0aW9uIjoKLSAgICAgICAgICAgICAgICBzZWxmLl9kZXNjciA9IHNlbGYuX3RleHQKLSAgICAgICAgICAgIGVsaWYgbmFtZSA9PSAiaXRlbSI6Ci0gICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2xpc3Rfc3RhcnRlZDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fb3V0LndyaXRlKCI8dWw+XG4iKQotICAgICAgICAgICAgICAgICAgICBzZWxmLl9saXN0X3N0YXJ0ZWQgPSBUcnVlCi0KLSAgICAgICAgICAgICAgICBzZWxmLl9vdXQud3JpdGUoJyAgPGxpPjxhIGhyZWY9IiVzIj4lczwvYT4gJXNcbicgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fbGluaywgc2VsZi5fdGl0bGUsIHNlbGYuX2Rlc2NyKSkKLQotICAgICAgICAgICAgICAgIHNlbGYuX3RpdGxlID0gTm9uZQotICAgICAgICAgICAgICAgIHNlbGYuX2xpbmsgPSBOb25lCi0gICAgICAgICAgICAgICAgc2VsZi5fZGVzY3IgPSAiIgotCi0gICAgICAgIGlmIG5hbWUgPT0gInJzcyI6Ci0gICAgICAgICAgICBzZWxmLl9vdXQud3JpdGUoYm90dG9tKQotCi0gICAgZGVmIGNoYXJhY3RlcnMoc2VsZiwgY29udGVudCk6Ci0gICAgICAgIHNlbGYuX3RleHQgPSBzZWxmLl90ZXh0ICsgY29udGVudAotCi0jIC0tLSBNYWluIHByb2dyYW0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBwYXJzZXIgPSBtYWtlX3BhcnNlcigpCi0gICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKFJTU0hhbmRsZXIoKSkKLSAgICBwYXJzZXIucGFyc2Uoc3lzLmFyZ3ZbMV0pCmRpZmYgLS1naXQgYS9EZW1vL3psaWIvbWluaWd6aXAucHkgYi9EZW1vL3psaWIvbWluaWd6aXAucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI1N2RlNzMuLjAwMDAwMDAKLS0tIGEvRGVtby96bGliL21pbmlnemlwLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLSMgRGVtbyBwcm9ncmFtIGZvciB6bGliOyBpdCBjb21wcmVzc2VzIG9yIGRlY29tcHJlc3NlcyBmaWxlcywgYnV0ICpkb2Vzbid0KgotIyBkZWxldGUgdGhlIG9yaWdpbmFsLiAgVGhpcyBkb2Vzbid0IHN1cHBvcnQgYWxsIG9mIGd6aXAncyBvcHRpb25zLgotIwotIyBUaGUgJ2d6aXAnIG1vZHVsZSBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSBwcm92aWRlcyBhIG1vcmUgY29tcGxldGUKLSMgaW1wbGVtZW50YXRpb24gb2YgZ3ppcC1mb3JtYXQgZmlsZXMuCi0KLWltcG9ydCB6bGliLCBzeXMsIG9zCi0KLUZURVhULCBGSENSQywgRkVYVFJBLCBGTkFNRSwgRkNPTU1FTlQgPSAxLCAyLCA0LCA4LCAxNgotCi1kZWYgd3JpdGUzMihvdXRwdXQsIHZhbHVlKToKLSAgICBvdXRwdXQud3JpdGUoYnl0ZXMoW3ZhbHVlICYgMjU1XSkpIDsgdmFsdWU9dmFsdWUgLy8gMjU2Ci0gICAgb3V0cHV0LndyaXRlKGJ5dGVzKFt2YWx1ZSAmIDI1NV0pKSA7IHZhbHVlPXZhbHVlIC8vIDI1NgotICAgIG91dHB1dC53cml0ZShieXRlcyhbdmFsdWUgJiAyNTVdKSkgOyB2YWx1ZT12YWx1ZSAvLyAyNTYKLSAgICBvdXRwdXQud3JpdGUoYnl0ZXMoW3ZhbHVlICYgMjU1XSkpCi0KLWRlZiByZWFkMzIoaW5wdXQpOgotICAgIHYgPSBvcmQoaW5wdXQucmVhZCgxKSkKLSAgICB2ICs9IChvcmQoaW5wdXQucmVhZCgxKSkgPDwgOCApCi0gICAgdiArPSAob3JkKGlucHV0LnJlYWQoMSkpIDw8IDE2KQotICAgIHYgKz0gKG9yZChpbnB1dC5yZWFkKDEpKSA8PCAyNCkKLSAgICByZXR1cm4gdgotCi1kZWYgY29tcHJlc3MoZmlsZW5hbWUsIGlucHV0LCBvdXRwdXQpOgotICAgIG91dHB1dC53cml0ZShiJ1wwMzdcMjEzXDAxMCcpICAgICAgICAjIFdyaXRlIHRoZSBoZWFkZXIsIC4uLgotICAgIG91dHB1dC53cml0ZShieXRlcyhbRk5BTUVdKSkgICAgICAgICAjIC4uLiBmbGFnIGJ5dGUgLi4uCi0KLSAgICBzdGF0dmFsID0gb3Muc3RhdChmaWxlbmFtZSkgICAgICAgICAgIyAuLi4gbW9kaWZpY2F0aW9uIHRpbWUgLi4uCi0gICAgbXRpbWUgPSBzdGF0dmFsWzhdCi0gICAgd3JpdGUzMihvdXRwdXQsIG10aW1lKQotICAgIG91dHB1dC53cml0ZShiJ1wwMDInKSAgICAgICAgICAgICAgICAjIC4uLiBzbG93ZXN0IGNvbXByZXNzaW9uIGFsZy4gLi4uCi0gICAgb3V0cHV0LndyaXRlKGInXDM3NycpICAgICAgICAgICAgICAgICMgLi4uIE9TICg9dW5rbm93bikgLi4uCi0gICAgYmZpbGVuYW1lID0gb3MuZnNlbmNvZGUoZmlsZW5hbWUpCi0gICAgb3V0cHV0LndyaXRlKGJmaWxlbmFtZSArIGInXDAwMCcpICAgICMgLi4uIG9yaWdpbmFsIGZpbGVuYW1lIC4uLgotCi0gICAgY3JjdmFsID0gemxpYi5jcmMzMihiJycpCi0gICAgY29tcG9iaiA9IHpsaWIuY29tcHJlc3NvYmooOSwgemxpYi5ERUZMQVRFRCwgLXpsaWIuTUFYX1dCSVRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bGliLkRFRl9NRU1fTEVWRUwsIDApCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgZGF0YSA9IGlucHV0LnJlYWQoMTAyNCkKLSAgICAgICAgaWYgZGF0YSA9PSBiJyc6Ci0gICAgICAgICAgICBicmVhawotICAgICAgICBjcmN2YWwgPSB6bGliLmNyYzMyKGRhdGEsIGNyY3ZhbCkKLSAgICAgICAgb3V0cHV0LndyaXRlKGNvbXBvYmouY29tcHJlc3MoZGF0YSkpCi0gICAgb3V0cHV0LndyaXRlKGNvbXBvYmouZmx1c2goKSkKLSAgICB3cml0ZTMyKG91dHB1dCwgY3JjdmFsKSAgICAgICAgICAgICAjIC4uLiB0aGUgQ1JDIC4uLgotICAgIHdyaXRlMzIob3V0cHV0LCBzdGF0dmFsWzZdKSAgICAgICAgICMgYW5kIHRoZSBmaWxlIHNpemUuCi0KLWRlZiBkZWNvbXByZXNzKGlucHV0LCBvdXRwdXQpOgotICAgIG1hZ2ljID0gaW5wdXQucmVhZCgyKQotICAgIGlmIG1hZ2ljICE9IGInXDAzN1wyMTMnOgotICAgICAgICBwcmludCgnTm90IGEgZ3ppcHBlZCBmaWxlJykKLSAgICAgICAgc3lzLmV4aXQoMCkKLSAgICBpZiBvcmQoaW5wdXQucmVhZCgxKSkgIT0gODoKLSAgICAgICAgcHJpbnQoJ1Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJykKLSAgICAgICAgc3lzLmV4aXQoMCkKLSAgICBmbGFnID0gb3JkKGlucHV0LnJlYWQoMSkpCi0gICAgaW5wdXQucmVhZCg0KzErMSkgICAgICAgICAgICAgICAgICAgIyBEaXNjYXJkIG1vZGlmaWNhdGlvbiB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXh0cmEgZmxhZ3MsIGFuZCBPUyBieXRlLgotICAgIGlmIGZsYWcgJiBGRVhUUkE6Ci0gICAgICAgICMgUmVhZCAmIGRpc2NhcmQgdGhlIGV4dHJhIGZpZWxkLCBpZiBwcmVzZW50Ci0gICAgICAgIHhsZW4gPSBvcmQoaW5wdXQucmVhZCgxKSkKLSAgICAgICAgeGxlbiArPSAyNTYqb3JkKGlucHV0LnJlYWQoMSkpCi0gICAgICAgIGlucHV0LnJlYWQoeGxlbikKLSAgICBpZiBmbGFnICYgRk5BTUU6Ci0gICAgICAgICMgUmVhZCBhbmQgZGlzY2FyZCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZW5hbWUKLSAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIHMgPSBpbnB1dC5yZWFkKDEpCi0gICAgICAgICAgICBpZiBzID09IGInXDAnOiBicmVhawotICAgIGlmIGZsYWcgJiBGQ09NTUVOVDoKLSAgICAgICAgIyBSZWFkIGFuZCBkaXNjYXJkIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nIGEgY29tbWVudAotICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgcyA9IGlucHV0LnJlYWQoMSkKLSAgICAgICAgICAgIGlmIHMgPT0gYidcMCc6IGJyZWFrCi0gICAgaWYgZmxhZyAmIEZIQ1JDOgotICAgICAgICBpbnB1dC5yZWFkKDIpICAgICAgICAgICAgICAgICAgICMgUmVhZCAmIGRpc2NhcmQgdGhlIDE2LWJpdCBoZWFkZXIgQ1JDCi0KLSAgICBkZWNvbXBvYmogPSB6bGliLmRlY29tcHJlc3NvYmooLXpsaWIuTUFYX1dCSVRTKQotICAgIGNyY3ZhbCA9IHpsaWIuY3JjMzIoYicnKQotICAgIGxlbmd0aCA9IDAKLSAgICB3aGlsZSBUcnVlOgotICAgICAgICBkYXRhID0gaW5wdXQucmVhZCgxMDI0KQotICAgICAgICBpZiBkYXRhID09IGIiIjoKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGRlY29tcGRhdGEgPSBkZWNvbXBvYmouZGVjb21wcmVzcyhkYXRhKQotICAgICAgICBvdXRwdXQud3JpdGUoZGVjb21wZGF0YSkKLSAgICAgICAgbGVuZ3RoICs9IGxlbihkZWNvbXBkYXRhKQotICAgICAgICBjcmN2YWwgPSB6bGliLmNyYzMyKGRlY29tcGRhdGEsIGNyY3ZhbCkKLQotICAgIGRlY29tcGRhdGEgPSBkZWNvbXBvYmouZmx1c2goKQotICAgIG91dHB1dC53cml0ZShkZWNvbXBkYXRhKQotICAgIGxlbmd0aCArPSBsZW4oZGVjb21wZGF0YSkKLSAgICBjcmN2YWwgPSB6bGliLmNyYzMyKGRlY29tcGRhdGEsIGNyY3ZhbCkKLQotICAgICMgV2UndmUgcmVhZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBzbyB3ZSBoYXZlIHRvIHJld2luZCBpbiBvcmRlcgotICAgICMgdG8gcmVyZWFkIHRoZSA4IGJ5dGVzIGNvbnRhaW5pbmcgdGhlIENSQyBhbmQgdGhlIGZpbGUgc2l6ZS4gIFRoZQotICAgICMgZGVjb21wcmVzc29yIGlzIHNtYXJ0IGFuZCBrbm93cyB3aGVuIHRvIHN0b3AsIHNvIGZlZWRpbmcgaXQKLSAgICAjIGV4dHJhIGRhdGEgaXMgaGFybWxlc3MuCi0gICAgaW5wdXQuc2VlaygtOCwgMikKLSAgICBjcmMzMiA9IHJlYWQzMihpbnB1dCkKLSAgICBpc2l6ZSA9IHJlYWQzMihpbnB1dCkKLSAgICBpZiBjcmMzMiAhPSBjcmN2YWw6Ci0gICAgICAgIHByaW50KCdDUkMgY2hlY2sgZmFpbGVkLicpCi0gICAgaWYgaXNpemUgIT0gbGVuZ3RoOgotICAgICAgICBwcmludCgnSW5jb3JyZWN0IGxlbmd0aCBvZiBkYXRhIHByb2R1Y2VkJykKLQotZGVmIG1haW4oKToKLSAgICBpZiBsZW4oc3lzLmFyZ3YpIT0yOgotICAgICAgICBwcmludCgnVXNhZ2U6IG1pbmlnemlwLnB5IDxmaWxlbmFtZT4nKQotICAgICAgICBwcmludCgnICBUaGUgZmlsZSB3aWxsIGJlIGNvbXByZXNzZWQgb3IgZGVjb21wcmVzc2VkLicpCi0gICAgICAgIHN5cy5leGl0KDApCi0KLSAgICBmaWxlbmFtZSA9IHN5cy5hcmd2WzFdCi0gICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoJy5neicpOgotICAgICAgICBjb21wcmVzc2luZyA9IEZhbHNlCi0gICAgICAgIG91dHB1dG5hbWUgPSBmaWxlbmFtZVs6LTNdCi0gICAgZWxzZToKLSAgICAgICAgY29tcHJlc3NpbmcgPSBUcnVlCi0gICAgICAgIG91dHB1dG5hbWUgPSBmaWxlbmFtZSArICcuZ3onCi0KLSAgICBpbnB1dCA9IG9wZW4oZmlsZW5hbWUsICdyYicpCi0gICAgb3V0cHV0ID0gb3BlbihvdXRwdXRuYW1lLCAnd2InKQotCi0gICAgaWYgY29tcHJlc3Npbmc6Ci0gICAgICAgIGNvbXByZXNzKGZpbGVuYW1lLCBpbnB1dCwgb3V0cHV0KQotICAgIGVsc2U6Ci0gICAgICAgIGRlY29tcHJlc3MoaW5wdXQsIG91dHB1dCkKLQotICAgIGlucHV0LmNsb3NlKCkKLSAgICBvdXRwdXQuY2xvc2UoKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvRGVtby96bGliL3psaWJkZW1vLnB5IGIvRGVtby96bGliL3psaWJkZW1vLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MGEzNmQ0Li4wMDAwMDAwCi0tLSBhL0RlbW8vemxpYi96bGliZGVtby5weQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMKLQotIyBUYWtlcyBhbiBvcHRpb25hbCBmaWxlbmFtZSwgZGVmYXVsdGluZyB0byB0aGlzIGZpbGUgaXRzZWxmLgotIyBSZWFkcyB0aGUgZmlsZSBhbmQgY29tcHJlc3NlcyB0aGUgY29udGVudCB1c2luZyBsZXZlbCAxIGFuZCBsZXZlbCA5Ci0jIGNvbXByZXNzaW9uLCBwcmludGluZyBhIHN1bW1hcnkgb2YgdGhlIHJlc3VsdHMuCi0KLWltcG9ydCB6bGliLCBzeXMKLQotZGVmIG1haW4oKToKLSAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKLSAgICAgICAgZmlsZW5hbWUgPSBzeXMuYXJndlsxXQotICAgIGVsc2U6Ci0gICAgICAgIGZpbGVuYW1lID0gc3lzLmFyZ3ZbMF0KLSAgICBwcmludCgnUmVhZGluZycsIGZpbGVuYW1lKQotCi0gICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncmInKSBhcyBmOiAgICAgICAgICAgIyBHZXQgdGhlIGRhdGEgdG8gY29tcHJlc3MKLSAgICAgICAgcyA9IGYucmVhZCgpCi0KLSAgICAjIEZpcnN0LCB3ZSdsbCBjb21wcmVzcyB0aGUgc3RyaW5nIGluIG9uZSBzdGVwCi0gICAgY29tcHRleHQgPSB6bGliLmNvbXByZXNzKHMsIDEpCi0gICAgZGVjb21wID0gemxpYi5kZWNvbXByZXNzKGNvbXB0ZXh0KQotCi0gICAgcHJpbnQoJzEtc3RlcCBjb21wcmVzc2lvbjogKGxldmVsIDEpJykKLSAgICBwcmludCgnICAgIE9yaWdpbmFsOicsIGxlbihzKSwgJ0NvbXByZXNzZWQ6JywgbGVuKGNvbXB0ZXh0KSwgZW5kPScgJykKLSAgICBwcmludCgnVW5jb21wcmVzc2VkOicsIGxlbihkZWNvbXApKQotCi0gICAgIyBOb3csIGxldCdzIGNvbXByZXNzIHRoZSBzdHJpbmcgaW4gc3RhZ2VzOyBzZXQgY2h1bmsgdG8gd29yayBpbiBzbWFsbGVyIHN0ZXBzCi0KLSAgICBjaHVuayA9IDI1NgotICAgIGNvbXByZXNzb3IgPSB6bGliLmNvbXByZXNzb2JqKDkpCi0gICAgZGVjb21wcmVzc29yID0gemxpYi5kZWNvbXByZXNzb2JqKCkKLSAgICBjb21wdGV4dCA9IGRlY29tcCA9IGInJwotICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihzKSwgY2h1bmspOgotICAgICAgICBjb21wdGV4dCArPSBjb21wcmVzc29yLmNvbXByZXNzKHNbaTppK2NodW5rXSkKLSAgICAjIERvbid0IGZvcmdldCB0byBjYWxsIGZsdXNoKCkhIQotICAgIGNvbXB0ZXh0ICs9IGNvbXByZXNzb3IuZmx1c2goKQotCi0gICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGNvbXB0ZXh0KSwgY2h1bmspOgotICAgICAgICBkZWNvbXAgKz0gZGVjb21wcmVzc29yLmRlY29tcHJlc3MoY29tcHRleHRbaTppK2NodW5rXSkKLSAgICBkZWNvbXAgKz0gZGVjb21wcmVzc29yLmZsdXNoKCkKLQotICAgIHByaW50KCdQcm9ncmVzc2l2ZSBjb21wcmVzc2lvbiAobGV2ZWwgOSk6JykKLSAgICBwcmludCgnICAgIE9yaWdpbmFsOicsIGxlbihzKSwgJ0NvbXByZXNzZWQ6JywgbGVuKGNvbXB0ZXh0KSwgZW5kPScgJykKLSAgICBwcmludCgnVW5jb21wcmVzc2VkOicsIGxlbihkZWNvbXApKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcHR5LnJzdCBiL0RvYy9saWJyYXJ5L3B0eS5yc3QKaW5kZXggZDAzOWZkZi4uMmI5Mzg1YiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcHR5LnJzdAorKysgYi9Eb2MvbGlicmFyeS9wdHkucnN0CkBAIC00NSwzICs0NSw1MCBAQAogICAgYSBmaWxlIGRlc2NyaXB0b3IuIFRoZSBkZWZhdWx0cyB0cnkgdG8gcmVhZCAxMDI0IGJ5dGVzIGVhY2ggdGltZSB0aGV5IGFyZQogICAgY2FsbGVkLgogCisKK0V4YW1wbGUKKy0tLS0tLS0KKworLi4gc2VjdGlvbmF1dGhvcjo6IFN0ZWVuIEx1bWhvbHQKKworVGhlIGZvbGxvd2luZyBwcm9ncmFtIGFjdHMgbGlrZSB0aGUgVW5peCBjb21tYW5kIDptYW5wYWdlOmBzY3JpcHQoMSlgLCB1c2luZyBhCitwc2V1ZG8tdGVybWluYWwgdG8gcmVjb3JkIGFsbCBpbnB1dCBhbmQgb3V0cHV0IG9mIGEgdGVybWluYWwgc2Vzc2lvbiBpbiBhCisidHlwZXNjcmlwdCIuIDo6CisKKyAgIGltcG9ydCBzeXMsIG9zLCB0aW1lLCBnZXRvcHQKKyAgIGltcG9ydCBwdHkKKworICAgbW9kZSA9ICd3YicKKyAgIHNoZWxsID0gJ3NoJworICAgZmlsZW5hbWUgPSAndHlwZXNjcmlwdCcKKyAgIGlmICdTSEVMTCcgaW4gb3MuZW52aXJvbjoKKyAgICAgICBzaGVsbCA9IG9zLmVudmlyb25bJ1NIRUxMJ10KKworICAgdHJ5OgorICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ2FwJykKKyAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IgYXMgbXNnOgorICAgICAgIHByaW50KCclczogJXMnICUgKHN5cy5hcmd2WzBdLCBtc2cpKQorICAgICAgIHN5cy5leGl0KDIpCisKKyAgIGZvciBvcHQsIGFyZyBpbiBvcHRzOgorICAgICAgICMgb3B0aW9uIC1hOiBhcHBlbmQgdG8gdHlwZXNjcmlwdCBmaWxlCisgICAgICAgaWYgb3B0ID09ICctYSc6CisgICAgICAgICAgIG1vZGUgPSAnYWInCisgICAgICAgIyBvcHRpb24gLXA6IHVzZSBhIFB5dGhvbiBzaGVsbCBhcyB0aGUgdGVybWluYWwgY29tbWFuZAorICAgICAgIGVsaWYgb3B0ID09ICctcCc6CisgICAgICAgICAgIHNoZWxsID0gc3lzLmV4ZWN1dGFibGUKKyAgIGlmIGFyZ3M6CisgICAgICAgZmlsZW5hbWUgPSBhcmdzWzBdCisKKyAgIHNjcmlwdCA9IG9wZW4oZmlsZW5hbWUsIG1vZGUpCisKKyAgIGRlZiByZWFkKGZkKToKKyAgICAgICBkYXRhID0gb3MucmVhZChmZCwgMTAyNCkKKyAgICAgICBzY3JpcHQud3JpdGUoZGF0YSkKKyAgICAgICByZXR1cm4gZGF0YQorCisgICBzeXMuc3Rkb3V0LndyaXRlKCdTY3JpcHQgc3RhcnRlZCwgZmlsZSBpcyAlc1xuJyAlIGZpbGVuYW1lKQorICAgc2NyaXB0LndyaXRlKCgnU2NyaXB0IHN0YXJ0ZWQgb24gJXNcbicgJSB0aW1lLmFzY3RpbWUoKSkuZW5jb2RlKCkpCisgICBwdHkuc3Bhd24oc2hlbGwsIHJlYWQpCisgICBzY3JpcHQud3JpdGUoKCdTY3JpcHQgZG9uZSBvbiAlc1xuJyAlIHRpbWUuYXNjdGltZSgpKS5lbmNvZGUoKSkKKyAgIHN5cy5zdGRvdXQud3JpdGUoJ1NjcmlwdCBkb25lLCBmaWxlIGlzICVzXG4nICUgZmlsZW5hbWUpCmRpZmYgLS1naXQgYS9EZW1vL3BhcnNlci90ZXN0X3VucGFyc2UucHkgYi9Ub29scy9wYXJzZXIvdGVzdF91bnBhcnNlLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEZW1vL3BhcnNlci90ZXN0X3VucGFyc2UucHkKcmVuYW1lIHRvIFRvb2xzL3BhcnNlci90ZXN0X3VucGFyc2UucHkKZGlmZiAtLWdpdCBhL0RlbW8vcGFyc2VyL3VucGFyc2UucHkgYi9Ub29scy9wYXJzZXIvdW5wYXJzZS5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRGVtby9wYXJzZXIvdW5wYXJzZS5weQpyZW5hbWUgdG8gVG9vbHMvcGFyc2VyL3VucGFyc2UucHkKZGlmZiAtLWdpdCBhL0RlbW8vc2NyaXB0cy9maW5kLXVuYW1lLnB5IGIvVG9vbHMvc2NyaXB0cy9maW5kLXVuYW1lLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEZW1vL3NjcmlwdHMvZmluZC11bmFtZS5weQpyZW5hbWUgdG8gVG9vbHMvc2NyaXB0cy9maW5kLXVuYW1lLnB5Cg==