ZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL2Jhc2VodHRwLnB5IGIvTGliL2Rvcy04eDMvYmFzZWh0dHAucHkKaW5kZXggMTBhNzA2ZS4uZWE1MDk1YSAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvYmFzZWh0dHAucHkKKysrIGIvTGliL2Rvcy04eDMvYmFzZWh0dHAucHkKQEAgLTg3LDYgKzg3LDggQEAKIAogY2xhc3MgSFRUUFNlcnZlcihTb2NrZXRTZXJ2ZXIuVENQU2VydmVyKToKIAorICAgIGFsbG93X3JldXNlX2FkZHJlc3MgPSAxICAgICMgU2VlbXMgdG8gbWFrZSBzZW5zZSBpbiB0ZXN0aW5nIGVudmlyb25tZW50CisKICAgICBkZWYgc2VydmVyX2JpbmQoc2VsZik6CiAgICAgICAgICIiIk92ZXJyaWRlIHNlcnZlcl9iaW5kIHRvIHN0b3JlIHRoZSBzZXJ2ZXIgbmFtZS4iIiIKICAgICAgICAgU29ja2V0U2VydmVyLlRDUFNlcnZlci5zZXJ2ZXJfYmluZChzZWxmKQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvY29uZmlncGEucHkgYi9MaWIvZG9zLTh4My9jb25maWdwYS5weQppbmRleCBlMWNlOWRkLi4zOGE4NWY0IDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My9jb25maWdwYS5weQorKysgYi9MaWIvZG9zLTh4My9jb25maWdwYS5weQpAQCAtMTk3LDcgKzE5Nyw3IEBACiAgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdGhlIGxpc3Qgd2lsbCBiZSByZWFkLiAgQSBzaW5nbGUKICAgICAgICAgZmlsZW5hbWUgbWF5IGFsc28gYmUgZ2l2ZW4uCiAgICAgICAgICIiIgotICAgICAgICBpZiB0eXBlKGZpbGVuYW1lcykgaXMgdHlwZSgnJyk6CisgICAgICAgIGlmIHR5cGUoZmlsZW5hbWVzKSBpbiBbdHlwZSgnJyksIHR5cGUodScnKV06CiAgICAgICAgICAgICBmaWxlbmFtZXMgPSBbZmlsZW5hbWVzXQogICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgdHJ5OgpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvbnR1cmwycGEucHkgYi9MaWIvZG9zLTh4My9udHVybDJwYS5weQppbmRleCBhZTI2MWJhLi4wNDQ1YjhhIDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My9udHVybDJwYS5weQorKysgYi9MaWIvZG9zLTh4My9udHVybDJwYS5weQpAQCAtMSw3ICsxLDggQEAKICIiIkNvbnZlcnQgYSBOVCBwYXRobmFtZSB0byBhIGZpbGUgVVJMIGFuZCB2aWNlIHZlcnNhLiIiIgogCiBkZWYgdXJsMnBhdGhuYW1lKHVybCk6Ci0JIiIiIENvbnZlcnQgYSBVUkwgdG8gYSBET1MgcGF0aC4uLgorCXIiIiJDb252ZXJ0IGEgVVJMIHRvIGEgRE9TIHBhdGguCisKIAkJLy8vQ3wvZm9vL2Jhci9zcGFtLmZvbwogCiAJCQliZWNvbWVzCkBAIC0zMiw3ICszMyw4IEBACiAJcmV0dXJuIHBhdGgKIAogZGVmIHBhdGhuYW1lMnVybChwKToKLQkiIiIgQ29udmVydCBhIERPUyBwYXRoIG5hbWUgdG8gYSBmaWxlIHVybC4uLgorCXIiIiJDb252ZXJ0IGEgRE9TIHBhdGggbmFtZSB0byBhIGZpbGUgdXJsLgorCiAJCUM6XGZvb1xiYXJcc3BhbS5mb28KIAogCQkJYmVjb21lcwpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvcmVjb252ZXIucHkgYi9MaWIvZG9zLTh4My9yZWNvbnZlci5weQppbmRleCAyYjA0NGI2Li43YzJkMzc2IDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My9yZWNvbnZlci5weQorKysgYi9MaWIvZG9zLTh4My9yZWNvbnZlci5weQpAQCAtMSw2ICsxLDYgQEAKICMhIC91c3IvYmluL2VudiBweXRob24xLjUKIAotIiIiQ29udmVydCBvbGQgKCJyZWdleCIpIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gbmV3IHN5bnRheCAoInJlIikuCityIiIiQ29udmVydCBvbGQgKCJyZWdleCIpIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gbmV3IHN5bnRheCAoInJlIikuCiAKIFdoZW4gaW1wb3J0ZWQgYXMgYSBtb2R1bGUsIHRoZXJlIGFyZSB0d28gZnVuY3Rpb25zLCB3aXRoIHRoZWlyIG93bgogc3RyaW5nczoKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3JsY29tcGxlLnB5IGIvTGliL2Rvcy04eDMvcmxjb21wbGUucHkKaW5kZXggYWExZGQwMi4uN2EyNDhmZSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvcmxjb21wbGUucHkKKysrIGIvTGliL2Rvcy04eDMvcmxjb21wbGUucHkKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9fLl9fZGljdF9fLmtleXMoKSwKICAgICAgICAgICAgICAgICAgICAgIF9fbWFpbl9fLl9fZGljdF9fLmtleXMoKV06CiAgICAgICAgICAgICBmb3Igd29yZCBpbiBsaXN0OgotICAgICAgICAgICAgICAgIGlmIHdvcmRbOm5dID09IHRleHQ6CisgICAgICAgICAgICAgICAgaWYgd29yZFs6bl0gPT0gdGV4dCBhbmQgd29yZCAhPSAiX19idWlsdGluc19fIjoKICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQod29yZCkKICAgICAgICAgcmV0dXJuIG1hdGNoZXMKIApAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgICAgIG1hdGNoZXMgPSBbXQogICAgICAgICBuID0gbGVuKGF0dHIpCiAgICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgotICAgICAgICAgICAgaWYgd29yZFs6bl0gPT0gYXR0cjoKKyAgICAgICAgICAgIGlmIHdvcmRbOm5dID09IGF0dHIgYW5kIHdvcmQgIT0gIl9fYnVpbHRpbnNfXyI6CiAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoIiVzLiVzIiAlIChleHByLCB3b3JkKSkKICAgICAgICAgcmV0dXJuIG1hdGNoZXMKIApkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvc2ltcGxlaHQucHkgYi9MaWIvZG9zLTh4My9zaW1wbGVodC5weQppbmRleCBhNDUxN2RjLi43MTI1NDEzIDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My9zaW1wbGVodC5weQorKysgYi9MaWIvZG9zLTh4My9zaW1wbGVodC5weQpAQCAtNiw3ICs2LDcgQEAKICIiIgogCiAKLV9fdmVyc2lvbl9fID0gIjAuMyIKK19fdmVyc2lvbl9fID0gIjAuNCIKIAogCiBpbXBvcnQgb3MKQEAgLTE0LDYgKzE0LDggQEAKIGltcG9ydCBwb3NpeHBhdGgKIGltcG9ydCBCYXNlSFRUUFNlcnZlcgogaW1wb3J0IHVybGxpYgoraW1wb3J0IGNnaQorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIAogCiBjbGFzcyBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIoQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CkBAIC01NywxNiArNTksNjIgQEAKIAogICAgICAgICAiIiIKICAgICAgICAgcGF0aCA9IHNlbGYudHJhbnNsYXRlX3BhdGgoc2VsZi5wYXRoKQorICAgICAgICBmID0gTm9uZQogICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgotICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwMywgIkRpcmVjdG9yeSBsaXN0aW5nIG5vdCBzdXBwb3J0ZWQiKQotICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGZvciBpbmRleCBpbiAiaW5kZXguaHRtbCIsICJpbmRleC5odG0iOgorICAgICAgICAgICAgICAgIGluZGV4ID0gb3MucGF0aC5qb2luKHBhdGgsIGluZGV4KQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGluZGV4KToKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGluZGV4CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmxpc3RfZGlyZWN0b3J5KHBhdGgpCisgICAgICAgIGN0eXBlID0gc2VsZi5ndWVzc190eXBlKHBhdGgpCisgICAgICAgIGlmIGN0eXBlLnN0YXJ0c3dpdGgoJ3RleHQvJyk6CisgICAgICAgICAgICBtb2RlID0gJ3InCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2RlID0gJ3JiJwogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmID0gb3BlbihwYXRoLCAncmInKQorICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCwgbW9kZSkKICAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDA0LCAiRmlsZSBub3QgZm91bmQiKQogICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKLSAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC10eXBlIiwgc2VsZi5ndWVzc190eXBlKHBhdGgpKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LXR5cGUiLCBjdHlwZSkKKyAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgIHJldHVybiBmCisKKyAgICBkZWYgbGlzdF9kaXJlY3Rvcnkoc2VsZiwgcGF0aCk6CisgICAgICAgICIiIkhlbHBlciB0byBwcm9kdWNlIGEgZGlyZWN0b3J5IGxpc3RpbmcgKGFic2VudCBpbmRleC5odG1sKS4KKworICAgICAgICBSZXR1cm4gdmFsdWUgaXMgZWl0aGVyIGEgZmlsZSBvYmplY3QsIG9yIE5vbmUgKGluZGljYXRpbmcgYW4KKyAgICAgICAgZXJyb3IpLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBoZWFkZXJzIGFyZSBzZW50LCBtYWtpbmcgdGhlCisgICAgICAgIGludGVyZmFjZSB0aGUgc2FtZSBhcyBmb3Igc2VuZF9oZWFkKCkuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpc3QgPSBvcy5saXN0ZGlyKHBhdGgpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcig0MDQsICJObyBwZXJtaXNzaW9uIHRvIGxpc3QgZGlyZWN0b3J5Iik7CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBsaXN0LnNvcnQobGFtYmRhIGEsIGI6IGNtcChhLmxvd2VyKCksIGIubG93ZXIoKSkpCisgICAgICAgIGYgPSBTdHJpbmdJTygpCisgICAgICAgIGYud3JpdGUoIjxoMj5EaXJlY3RvcnkgbGlzdGluZyBmb3IgJXM8L2gyPlxuIiAlIHNlbGYucGF0aCkKKyAgICAgICAgZi53cml0ZSgiPGhyPlxuPHVsPlxuIikKKyAgICAgICAgZm9yIG5hbWUgaW4gbGlzdDoKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHBhdGgsIG5hbWUpCisgICAgICAgICAgICBkaXNwbGF5bmFtZSA9IGxpbmtuYW1lID0gbmFtZSA9IGNnaS5lc2NhcGUobmFtZSkKKyAgICAgICAgICAgICMgQXBwZW5kIC8gZm9yIGRpcmVjdG9yaWVzIG9yIEAgZm9yIHN5bWJvbGljIGxpbmtzCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGxuYW1lKToKKyAgICAgICAgICAgICAgICBkaXNwbGF5bmFtZSA9IG5hbWUgKyAiLyIKKyAgICAgICAgICAgICAgICBsaW5rbmFtZSA9IG5hbWUgKyBvcy5zZXAKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKGZ1bGxuYW1lKToKKyAgICAgICAgICAgICAgICBkaXNwbGF5bmFtZSA9IG5hbWUgKyAiQCIKKyAgICAgICAgICAgICAgICAjIE5vdGU6IGEgbGluayB0byBhIGRpcmVjdG9yeSBkaXNwbGF5cyB3aXRoIEAgYW5kIGxpbmtzIHdpdGggLworICAgICAgICAgICAgZi53cml0ZSgnPGxpPjxhIGhyZWY9IiVzIj4lczwvYT5cbicgJSAobGlua25hbWUsIGRpc3BsYXluYW1lKSkKKyAgICAgICAgZi53cml0ZSgiPC91bD5cbjxocj5cbiIpCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LXR5cGUiLCAidGV4dC9odG1sIikKICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCiAgICAgICAgIHJldHVybiBmCiAKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3NvY2tldHNlLnB5IGIvTGliL2Rvcy04eDMvc29ja2V0c2UucHkKaW5kZXggMmM3MzM1Ni4uNTU2MmZiMCAxMDA3NTUKLS0tIGEvTGliL2Rvcy04eDMvc29ja2V0c2UucHkKKysrIGIvTGliL2Rvcy04eDMvc29ja2V0c2UucHkKQEAgLTE0MSw2ICsxNDEsNyBAQAogICAgIC0gYWRkcmVzc19mYW1pbHkKICAgICAtIHNvY2tldF90eXBlCiAgICAgLSByZXF1ZXN0X3F1ZXVlX3NpemUgKG9ubHkgZm9yIHN0cmVhbSBzb2NrZXRzKQorICAgIC0gcmV1c2VfYWRkcmVzcwogCiAgICAgSW5zdGFuY2UgdmFyaWFibGVzOgogCkBAIC0xNTYsNiArMTU3LDggQEAKIAogICAgIHJlcXVlc3RfcXVldWVfc2l6ZSA9IDUKIAorICAgIGFsbG93X3JldXNlX2FkZHJlc3MgPSAwCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kbGVyQ2xhc3MpOgogICAgICAgICAiIiJDb25zdHJ1Y3Rvci4gIE1heSBiZSBleHRlbmRlZCwgZG8gbm90IG92ZXJyaWRlLiIiIgogICAgICAgICBzZWxmLnNlcnZlcl9hZGRyZXNzID0gc2VydmVyX2FkZHJlc3MKQEAgLTE3MSw2ICsxNzQsOCBAQAogICAgICAgICBNYXkgYmUgb3ZlcnJpZGRlbi4KIAogICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5hbGxvd19yZXVzZV9hZGRyZXNzOgorICAgICAgICAgICAgc2VsZi5zb2NrZXQuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKICAgICAgICAgc2VsZi5zb2NrZXQuYmluZChzZWxmLnNlcnZlcl9hZGRyZXNzKQogCiAgICAgZGVmIHNlcnZlcl9hY3RpdmF0ZShzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3NyZV9jb21wLnB5IGIvTGliL2Rvcy04eDMvc3JlX2NvbXAucHkKaW5kZXggODczODA2MS4uYzA0MjM3NSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvc3JlX2NvbXAucHkKKysrIGIvTGliL2Rvcy04eDMvc3JlX2NvbXAucHkKQEAgLTEsMjQgKzEsMTYgQEAKICMKICMgU2VjcmV0IExhYnMnIFJlZ3VsYXIgRXhwcmVzc2lvbiBFbmdpbmUKLSMgJElkJAogIwogIyBjb252ZXJ0IHRlbXBsYXRlIHRvIGludGVybmFsIGZvcm1hdAogIwogIyBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMCBieSBTZWNyZXQgTGFicyBBQi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjCi0jIFRoaXMgY29kZSBjYW4gb25seSBiZSB1c2VkIGZvciAxLjYgYWxwaGEgdGVzdGluZy4gIEFsbCBvdGhlciB1c2UKLSMgcmVxdWlyZSBleHBsaWNpdCBwZXJtaXNzaW9uIGZyb20gU2VjcmV0IExhYnMgQUIuCi0jCiAjIFBvcnRpb25zIG9mIHRoaXMgZW5naW5lIGhhdmUgYmVlbiBkZXZlbG9wZWQgaW4gY29vcGVyYXRpb24gd2l0aAogIyBDTlJJLiAgSGV3bGV0dC1QYWNrYXJkIHByb3ZpZGVkIGZ1bmRpbmcgZm9yIDEuNiBpbnRlZ3JhdGlvbiBhbmQKICMgb3RoZXIgY29tcGF0aWJpbGl0eSB3b3JrLgogIwogCi0jIEZJWE1FOiA8Zmw+IGZvcm1hbGl6ZSAob2JqZWN0aWZ5PykgYW5kIGRvY3VtZW50IHRoZSBjb21waWxlciBjb2RlCi0jIGZvcm1hdCwgc28gdGhhdCBvdGhlciBmcm9udGVuZHMgY2FuIHVzZSB0aGlzIGNvbXBpbGVyCi0KLWltcG9ydCBhcnJheSwgc3RyaW5nLCBzeXMKLQoraW1wb3J0IGFycmF5CiBpbXBvcnQgX3NyZQogCiBmcm9tIHNyZV9jb25zdGFudHMgaW1wb3J0ICoKQEAgLTMwLDE1OCArMjIsMTUzIEBACiBlbHNlOgogICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgImNhbm5vdCBmaW5kIGEgdXNlYWJsZSBhcnJheSB0eXBlIgogCi0jIEZJWE1FOiA8Zmw+IHNob3VsZCBtb3ZlIHNvbWUgb3B0aW1pemF0aW9ucyBmcm9tIHRoZSBwYXJzZXIgdG8gaGVyZSEKLQotY2xhc3MgQ29kZToKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0Jc2VsZi5kYXRhID0gW10KLSAgICBkZWYgX19sZW5fXyhzZWxmKToKLQlyZXR1cm4gbGVuKHNlbGYuZGF0YSkKLSAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgotCXJldHVybiBzZWxmLmRhdGFbaW5kZXhdCi0gICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCBjb2RlKToKLQlzZWxmLmRhdGFbaW5kZXhdID0gY29kZQotICAgIGRlZiBhcHBlbmQoc2VsZiwgY29kZSk6Ci0Jc2VsZi5kYXRhLmFwcGVuZChjb2RlKQotICAgIGRlZiB0b2RhdGEoc2VsZik6Ci0JIyBwcmludCBzZWxmLmRhdGEKLQlyZXR1cm4gYXJyYXkuYXJyYXkoV09SRFNJWkUsIHNlbGYuZGF0YSkudG9zdHJpbmcoKQotCi1kZWYgX2xvd2VyKGxpdGVyYWwpOgotICAgICMgcmV0dXJuIF9zcmUuX2xvd2VyKGxpdGVyYWwpICMgRklYTUUKLSAgICByZXR1cm4gc3RyaW5nLmxvd2VyKGxpdGVyYWwpCi0KIGRlZiBfY29tcGlsZShjb2RlLCBwYXR0ZXJuLCBmbGFncyk6Ci0gICAgYXBwZW5kID0gY29kZS5hcHBlbmQKKyAgICBlbWl0ID0gY29kZS5hcHBlbmQKICAgICBmb3Igb3AsIGF2IGluIHBhdHRlcm46CiAJaWYgb3AgaXMgQU5ZOgotCSAgICBpZiAicyIgaW4gZmxhZ3M6Ci0JCWFwcGVuZChDT0RFU1tvcF0pICMgYW55IGNoYXJhY3RlciBhdCBhbGwhCisJICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfRE9UQUxMOgorCQllbWl0KE9QQ09ERVNbb3BdKQogCSAgICBlbHNlOgotCQlhcHBlbmQoQ09ERVNbTk9UX0xJVEVSQUxdKQotCQlhcHBlbmQoMTApCisJCWVtaXQoT1BDT0RFU1tDQVRFR09SWV0pCisJCWVtaXQoQ0hDT0RFU1tDQVRFR09SWV9OT1RfTElORUJSRUFLXSkKIAllbGlmIG9wIGluIChTVUNDRVNTLCBGQUlMVVJFKToKLQkgICAgYXBwZW5kKENPREVTW29wXSkKKwkgICAgZW1pdChPUENPREVTW29wXSkKIAllbGlmIG9wIGlzIEFUOgotCSAgICBhcHBlbmQoQ09ERVNbb3BdKQotCSAgICBhcHBlbmQoUE9TSVRJT05TW2F2XSkKKwkgICAgZW1pdChPUENPREVTW29wXSkKKwkgICAgaWYgZmxhZ3MgJiBTUkVfRkxBR19NVUxUSUxJTkU6CisJCWVtaXQoQVRDT0RFU1tBVF9NVUxUSUxJTkVbYXZdXSkKKwkgICAgZWxzZToKKwkJZW1pdChBVENPREVTW2F2XSkKIAllbGlmIG9wIGlzIEJSQU5DSDoKLQkgICAgYXBwZW5kKENPREVTW29wXSkKKwkgICAgZW1pdChPUENPREVTW29wXSkKIAkgICAgdGFpbCA9IFtdCiAJICAgIGZvciBhdiBpbiBhdlsxXToKLQkJc2tpcCA9IGxlbihjb2RlKTsgYXBwZW5kKDApCisJCXNraXAgPSBsZW4oY29kZSk7IGVtaXQoMCkKIAkJX2NvbXBpbGUoY29kZSwgYXYsIGZsYWdzKQotCQlhcHBlbmQoQ09ERVNbSlVNUF0pCi0JCXRhaWwuYXBwZW5kKGxlbihjb2RlKSk7IGFwcGVuZCgwKQorIAkJZW1pdChPUENPREVTW0pVTVBdKQorIAkJdGFpbC5hcHBlbmQobGVuKGNvZGUpKTsgZW1pdCgwKQogCQljb2RlW3NraXBdID0gbGVuKGNvZGUpIC0gc2tpcAotCSAgICBhcHBlbmQoMCkgIyBlbmQgb2YgYnJhbmNoCi0JICAgIGZvciB0YWlsIGluIHRhaWw6CisJICAgIGVtaXQoMCkgIyBlbmQgb2YgYnJhbmNoCisgCSAgICBmb3IgdGFpbCBpbiB0YWlsOgogCQljb2RlW3RhaWxdID0gbGVuKGNvZGUpIC0gdGFpbAogCWVsaWYgb3AgaXMgQ0FMTDoKLQkgICAgYXBwZW5kKENPREVTW29wXSkKLQkgICAgc2tpcCA9IGxlbihjb2RlKTsgYXBwZW5kKDApCisJICAgIGVtaXQoT1BDT0RFU1tvcF0pCisJICAgIHNraXAgPSBsZW4oY29kZSk7IGVtaXQoMCkKIAkgICAgX2NvbXBpbGUoY29kZSwgYXYsIGZsYWdzKQotCSAgICBhcHBlbmQoQ09ERVNbU1VDQ0VTU10pCisJICAgIGVtaXQoT1BDT0RFU1tTVUNDRVNTXSkKIAkgICAgY29kZVtza2lwXSA9IGxlbihjb2RlKSAtIHNraXAKLQllbGlmIG9wIGlzIENBVEVHT1JZOiAjIG5vdCB1c2VkIGJ5IGN1cnJlbnQgcGFyc2VyCi0JICAgIGFwcGVuZChDT0RFU1tvcF0pCi0JICAgIGFwcGVuZChDQVRFR09SSUVTW2F2XSkKKwllbGlmIG9wIGlzIENBVEVHT1JZOgorCSAgICBlbWl0KE9QQ09ERVNbb3BdKQorCSAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0xPQ0FMRToKKwkJZW1pdChDSF9MT0NBTEVbQ0hDT0RFU1thdl1dKQorCSAgICBlbGlmIGZsYWdzICYgU1JFX0ZMQUdfVU5JQ09ERToKKwkJZW1pdChDSF9VTklDT0RFW0NIQ09ERVNbYXZdXSkKKwkgICAgZWxzZToKKwkJZW1pdChDSENPREVTW2F2XSkKIAllbGlmIG9wIGlzIEdST1VQOgotCSAgICBpZiAiaSIgaW4gZmxhZ3M6Ci0JCWFwcGVuZChDT0RFU1tNQVBfSUdOT1JFW29wXV0pCisJICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfSUdOT1JFQ0FTRToKKwkJZW1pdChPUENPREVTW09QX0lHTk9SRVtvcF1dKQogCSAgICBlbHNlOgotCQlhcHBlbmQoQ09ERVNbb3BdKQotCSAgICBhcHBlbmQoYXYpCisJCWVtaXQoT1BDT0RFU1tvcF0pCisJICAgIGVtaXQoYXYtMSkKIAllbGlmIG9wIGlzIElOOgotCSAgICBpZiAiaSIgaW4gZmxhZ3M6Ci0JCWFwcGVuZChDT0RFU1tNQVBfSUdOT1JFW29wXV0pCi0JCWRlZiBmaXh1cChsaXRlcmFsKToKLQkJICAgIHJldHVybiBvcmQoX2xvd2VyKGxpdGVyYWwpKQorCSAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0lHTk9SRUNBU0U6CisJCWVtaXQoT1BDT0RFU1tPUF9JR05PUkVbb3BdXSkKKwkJZGVmIGZpeHVwKGxpdGVyYWwsIGZsYWdzPWZsYWdzKToKKwkJICAgIHJldHVybiBfc3JlLmdldGxvd2VyKG9yZChsaXRlcmFsKSwgZmxhZ3MpCiAJICAgIGVsc2U6Ci0JCWFwcGVuZChDT0RFU1tvcF0pCisJCWVtaXQoT1BDT0RFU1tvcF0pCiAJCWZpeHVwID0gb3JkCi0JICAgIHNraXAgPSBsZW4oY29kZSk7IGFwcGVuZCgwKQorCSAgICBza2lwID0gbGVuKGNvZGUpOyBlbWl0KDApCiAJICAgIGZvciBvcCwgYXYgaW4gYXY6Ci0JCWFwcGVuZChDT0RFU1tvcF0pCisJCWVtaXQoT1BDT0RFU1tvcF0pCiAJCWlmIG9wIGlzIE5FR0FURToKIAkJICAgIHBhc3MKIAkJZWxpZiBvcCBpcyBMSVRFUkFMOgotCQkgICAgYXBwZW5kKGZpeHVwKGF2KSkKKwkJICAgIGVtaXQoZml4dXAoYXYpKQogCQllbGlmIG9wIGlzIFJBTkdFOgotCQkgICAgYXBwZW5kKGZpeHVwKGF2WzBdKSkKLQkJICAgIGFwcGVuZChmaXh1cChhdlsxXSkpCisJCSAgICBlbWl0KGZpeHVwKGF2WzBdKSkKKwkJICAgIGVtaXQoZml4dXAoYXZbMV0pKQogCQllbGlmIG9wIGlzIENBVEVHT1JZOgotCQkgICAgYXBwZW5kKENBVEVHT1JJRVNbYXZdKQorCQkgICAgaWYgZmxhZ3MgJiBTUkVfRkxBR19MT0NBTEU6CisJCQllbWl0KENIX0xPQ0FMRVtDSENPREVTW2F2XV0pCisJCSAgICBlbGlmIGZsYWdzICYgU1JFX0ZMQUdfVU5JQ09ERToKKwkJCWVtaXQoQ0hfVU5JQ09ERVtDSENPREVTW2F2XV0pCisJCSAgICBlbHNlOgorCQkJZW1pdChDSENPREVTW2F2XSkKIAkJZWxzZToKLQkJICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bnN1cHBvcnRlZCBzZXQgb3BlcmF0b3IiCi0JICAgIGFwcGVuZChDT0RFU1tGQUlMVVJFXSkKKwkJICAgIHJhaXNlIGVycm9yLCAiaW50ZXJuYWw6IHVuc3VwcG9ydGVkIHNldCBvcGVyYXRvciIKKwkgICAgZW1pdChPUENPREVTW0ZBSUxVUkVdKQogCSAgICBjb2RlW3NraXBdID0gbGVuKGNvZGUpIC0gc2tpcAogCWVsaWYgb3AgaW4gKExJVEVSQUwsIE5PVF9MSVRFUkFMKToKLQkgICAgaWYgImkiIGluIGZsYWdzOgotCQlhcHBlbmQoQ09ERVNbTUFQX0lHTk9SRVtvcF1dKQotCQlhcHBlbmQob3JkKF9sb3dlcihhdikpKQorCSAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0lHTk9SRUNBU0U6CisJCWVtaXQoT1BDT0RFU1tPUF9JR05PUkVbb3BdXSkKIAkgICAgZWxzZToKLQkJYXBwZW5kKENPREVTW29wXSkKLQkJYXBwZW5kKG9yZChhdikpCisJCWVtaXQoT1BDT0RFU1tvcF0pCisJICAgIGVtaXQob3JkKGF2KSkKIAllbGlmIG9wIGlzIE1BUks6Ci0JICAgIGFwcGVuZChDT0RFU1tvcF0pCi0JICAgIGFwcGVuZChhdikKKwkgICAgZW1pdChPUENPREVTW29wXSkKKwkgICAgZW1pdChhdikKICAJZWxpZiBvcCBpbiAoUkVQRUFULCBNSU5fUkVQRUFULCBNQVhfUkVQRUFUKToKLQkgICAgbG8sIGhpID0gYXZbMl0uZ2V0d2lkdGgoKQotIAkgICAgaWYgbG8gPT0gMDoKLSAJCXJhaXNlIFN5bnRheEVycm9yLCAiY2Fubm90IHJlcGVhdCB6ZXJvLXdpZHRoIGl0ZW1zIgotCSAgICBpZiBsbyA9PSBoaSA9PSAxIGFuZCBvcCBpcyBNQVhfUkVQRUFUOgotCQlhcHBlbmQoQ09ERVNbTUFYX1JFUEVBVF9PTkVdKQotCQlza2lwID0gbGVuKGNvZGUpOyBhcHBlbmQoMCkKLQkJYXBwZW5kKGF2WzBdKQotCQlhcHBlbmQoYXZbMV0pCisJICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfVEVNUExBVEU6CisJCWVtaXQoT1BDT0RFU1tSRVBFQVRdKQorCQlza2lwID0gbGVuKGNvZGUpOyBlbWl0KDApCisJCWVtaXQoYXZbMF0pCisJCWVtaXQoYXZbMV0pCiAJCV9jb21waWxlKGNvZGUsIGF2WzJdLCBmbGFncykKLQkJYXBwZW5kKENPREVTW1NVQ0NFU1NdKQorCQllbWl0KE9QQ09ERVNbU1VDQ0VTU10pCiAJCWNvZGVbc2tpcF0gPSBsZW4oY29kZSkgLSBza2lwCiAJICAgIGVsc2U6Ci0JCWFwcGVuZChDT0RFU1tvcF0pCi0JCXNraXAgPSBsZW4oY29kZSk7IGFwcGVuZCgwKQotCQlhcHBlbmQoYXZbMF0pCi0JCWFwcGVuZChhdlsxXSkKLQkJX2NvbXBpbGUoY29kZSwgYXZbMl0sIGZsYWdzKQotCQlpZiBvcCBpcyBNSU5fUkVQRUFUOgotCQkgICAgYXBwZW5kKENPREVTW01JTl9VTlRJTF0pCisJCWxvLCBoaSA9IGF2WzJdLmdldHdpZHRoKCkKKwkJaWYgbG8gPT0gMDoKKwkJICAgIHJhaXNlIGVycm9yLCAibm90aGluZyB0byByZXBlYXQiCisJCWlmIDAgYW5kIGxvID09IGhpID09IDEgYW5kIG9wIGlzIE1BWF9SRVBFQVQ6CisJCSAgICAjIEZJWE1FOiA8Zmw+IG5lZWQgYSBiZXR0ZXIgd2F5IHRvIGZpZ3VyZSBvdXQgd2hlbgorCQkgICAgIyBpdCdzIHNhZmUgdG8gdXNlIHRoaXMgb25lIChpbiB0aGUgcGFyc2VyLCBwcm9iYWJseSkKKwkJICAgIGVtaXQoT1BDT0RFU1tNQVhfUkVQRUFUX09ORV0pCisJCSAgICBza2lwID0gbGVuKGNvZGUpOyBlbWl0KDApCisJCSAgICBlbWl0KGF2WzBdKQorCQkgICAgZW1pdChhdlsxXSkKKwkJICAgIF9jb21waWxlKGNvZGUsIGF2WzJdLCBmbGFncykKKwkJICAgIGVtaXQoT1BDT0RFU1tTVUNDRVNTXSkKKwkJICAgIGNvZGVbc2tpcF0gPSBsZW4oY29kZSkgLSBza2lwCiAJCWVsc2U6Ci0JCSAgICAjIEZJWE1FOiBNQVhfUkVQRUFUIFBST0JBQkxZIERPRVNOJ1QgV09SSyAoPykKLQkJICAgIGFwcGVuZChDT0RFU1tNQVhfVU5USUxdKQotCQljb2RlW3NraXBdID0gbGVuKGNvZGUpIC0gc2tpcAorCQkgICAgZW1pdChPUENPREVTW29wXSkKKwkJICAgIHNraXAgPSBsZW4oY29kZSk7IGVtaXQoMCkKKwkJICAgIGVtaXQoYXZbMF0pCisJCSAgICBlbWl0KGF2WzFdKQorCQkgICAgX2NvbXBpbGUoY29kZSwgYXZbMl0sIGZsYWdzKQorCQkgICAgZW1pdChPUENPREVTW1NVQ0NFU1NdKQorCQkgICAgY29kZVtza2lwXSA9IGxlbihjb2RlKSAtIHNraXAKIAllbGlmIG9wIGlzIFNVQlBBVFRFUk46Ci0jIyAJICAgIGdyb3VwID0gYXZbMF0KLSMjIAkgICAgaWYgZ3JvdXA6Ci0jIyAJCWFwcGVuZChDT0RFU1tNQVJLXSkKLSMjIAkJYXBwZW5kKChncm91cC0xKSoyKQorIAkgICAgZ3JvdXAgPSBhdlswXQorIAkgICAgaWYgZ3JvdXA6CisgCQllbWl0KE9QQ09ERVNbTUFSS10pCisgCQllbWl0KChncm91cC0xKSoyKQogCSAgICBfY29tcGlsZShjb2RlLCBhdlsxXSwgZmxhZ3MpCi0jIyAJICAgIGlmIGdyb3VwOgotIyMgCQlhcHBlbmQoQ09ERVNbTUFSS10pCi0jIyAJCWFwcGVuZCgoZ3JvdXAtMSkqMisxKQorIAkgICAgaWYgZ3JvdXA6CisgCQllbWl0KE9QQ09ERVNbTUFSS10pCisgCQllbWl0KChncm91cC0xKSoyKzEpCiAJZWxzZToKIAkgICAgcmFpc2UgVmFsdWVFcnJvciwgKCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUiLCBvcCkKIAotZGVmIGNvbXBpbGUocCwgZmxhZ3M9KCkpOgotICAgICMgY29udmVydCBwYXR0ZXJuIGxpc3QgdG8gaW50ZXJuYWwgZm9ybWF0CitkZWYgY29tcGlsZShwLCBmbGFncz0wKToKKyAgICAjIGludGVybmFsOiBjb252ZXJ0IHBhdHRlcm4gbGlzdCB0byBpbnRlcm5hbCBmb3JtYXQKICAgICBpZiB0eXBlKHApIGluICh0eXBlKCIiKSwgdHlwZSh1IiIpKToKIAlpbXBvcnQgc3JlX3BhcnNlCiAJcGF0dGVybiA9IHAKIAlwID0gc3JlX3BhcnNlLnBhcnNlKHApCiAgICAgZWxzZToKIAlwYXR0ZXJuID0gTm9uZQotICAgICMgcHJpbnQgcC5nZXR3aWR0aCgpCi0gICAgIyBwcmludCBwCi0gICAgY29kZSA9IENvZGUoKQotICAgIF9jb21waWxlKGNvZGUsIHAuZGF0YSwgcC5wYXR0ZXJuLmZsYWdzKQotICAgIGNvZGUuYXBwZW5kKENPREVTW1NVQ0NFU1NdKQotICAgICMgcHJpbnQgbGlzdChjb2RlLmRhdGEpCi0gICAgZGF0YSA9IGNvZGUudG9kYXRhKCkKLSAgICBpZiAwOiAjIGRlYnVnZ2luZwotCXByaW50Ci0JcHJpbnQgIi0iICogNjgKLQlpbXBvcnQgc3JlX2Rpc2FzbQotCXNyZV9kaXNhc20uZGlzYXNtKGRhdGEpCi0JcHJpbnQgIi0iICogNjgKLSAgICAjIHByaW50IGxlbihkYXRhKSwgcC5wYXR0ZXJuLmdyb3VwcywgbGVuKHAucGF0dGVybi5ncm91cGRpY3QpCi0gICAgcmV0dXJuIF9zcmUuY29tcGlsZShwYXR0ZXJuLCBkYXRhLCBwLnBhdHRlcm4uZ3JvdXBzLTEsIHAucGF0dGVybi5ncm91cGRpY3QpCisgICAgZmxhZ3MgPSBwLnBhdHRlcm4uZmxhZ3MgfCBmbGFncworICAgIGNvZGUgPSBbXQorICAgIF9jb21waWxlKGNvZGUsIHAuZGF0YSwgZmxhZ3MpCisgICAgY29kZS5hcHBlbmQoT1BDT0RFU1tTVUNDRVNTXSkKKyAgICAjIEZJWE1FOiA8Zmw+IGdldCByaWQgb2YgdGhpcyBsaW1pdGF0aW9uCisgICAgYXNzZXJ0IHAucGF0dGVybi5ncm91cHMgPD0gMTAwLFwKKwkgICAic29ycnksIGJ1dCB0aGlzIHZlcnNpb24gb25seSBzdXBwb3J0cyAxMDAgbmFtZWQgZ3JvdXBzIgorICAgIHJldHVybiBfc3JlLmNvbXBpbGUoCisJcGF0dGVybiwgZmxhZ3MsCisJYXJyYXkuYXJyYXkoV09SRFNJWkUsIGNvZGUpLnRvc3RyaW5nKCksCisJcC5wYXR0ZXJuLmdyb3Vwcy0xLCBwLnBhdHRlcm4uZ3JvdXBkaWN0CisJKQpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvc3JlX2NvbnMucHkgYi9MaWIvZG9zLTh4My9zcmVfY29ucy5weQppbmRleCBhZjg4MzA5Li5mNWU3ODk0IDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My9zcmVfY29ucy5weQorKysgYi9MaWIvZG9zLTh4My9zcmVfY29ucy5weQpAQCAtMSwyMCArMSwyMSBAQAogIwogIyBTZWNyZXQgTGFicycgUmVndWxhciBFeHByZXNzaW9uIEVuZ2luZQotIyAkSWQkCiAjCiAjIHZhcmlvdXMgc3ltYm9scyB1c2VkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lLgogIyBydW4gdGhpcyBzY3JpcHQgdG8gdXBkYXRlIHRoZSBfc3JlIGluY2x1ZGUgZmlsZXMhCiAjCiAjIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIGJ5IFNlY3JldCBMYWJzIEFCLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMKLSMgVGhpcyBjb2RlIGNhbiBvbmx5IGJlIHVzZWQgZm9yIDEuNiBhbHBoYSB0ZXN0aW5nLiAgQWxsIG90aGVyIHVzZQotIyByZXF1aXJlIGV4cGxpY2l0IHBlcm1pc3Npb24gZnJvbSBTZWNyZXQgTGFicyBBQi4KLSMKICMgUG9ydGlvbnMgb2YgdGhpcyBlbmdpbmUgaGF2ZSBiZWVuIGRldmVsb3BlZCBpbiBjb29wZXJhdGlvbiB3aXRoCiAjIENOUkkuICBIZXdsZXR0LVBhY2thcmQgcHJvdmlkZWQgZnVuZGluZyBmb3IgMS42IGludGVncmF0aW9uIGFuZAogIyBvdGhlciBjb21wYXRpYmlsaXR5IHdvcmsuCiAjCiAKKyMgc2hvdWxkIHRoaXMgcmVhbGx5IGJlIGhlcmU/CisKK2NsYXNzIGVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCiAjIG9wZXJhdG9ycwogCiBGQUlMVVJFID0gImZhaWx1cmUiCkBAIC0zMCwzOCArMzEsNTEgQEAKIEdST1VQX0lHTk9SRSA9ICJncm91cF9pZ25vcmUiCiBJTiA9ICJpbiIKIElOX0lHTk9SRSA9ICJpbl9pZ25vcmUiCitJTkZPID0gImluZm8iCiBKVU1QID0gImp1bXAiCiBMSVRFUkFMID0gImxpdGVyYWwiCiBMSVRFUkFMX0lHTk9SRSA9ICJsaXRlcmFsX2lnbm9yZSIKIE1BUksgPSAibWFyayIKIE1BWF9SRVBFQVQgPSAibWF4X3JlcGVhdCIKIE1BWF9SRVBFQVRfT05FID0gIm1heF9yZXBlYXRfb25lIgotTUFYX1VOVElMID0gIm1heF91bnRpbCIKIE1JTl9SRVBFQVQgPSAibWluX3JlcGVhdCIKLU1JTl9VTlRJTCA9ICJtaW5fdW50aWwiCiBORUdBVEUgPSAibmVnYXRlIgogTk9UX0xJVEVSQUwgPSAibm90X2xpdGVyYWwiCiBOT1RfTElURVJBTF9JR05PUkUgPSAibm90X2xpdGVyYWxfaWdub3JlIgogUkFOR0UgPSAicmFuZ2UiCiBSRVBFQVQgPSAicmVwZWF0IgorUkVQRUFUX09ORSA9ICJyZXBlYXRfb25lIgogU1VCUEFUVEVSTiA9ICJzdWJwYXR0ZXJuIgogCiAjIHBvc2l0aW9ucwogQVRfQkVHSU5OSU5HID0gImF0X2JlZ2lubmluZyIKK0FUX0JFR0lOTklOR19MSU5FID0gImF0X2JlZ2lubmluZ19saW5lIgogQVRfQk9VTkRBUlkgPSAiYXRfYm91bmRhcnkiCiBBVF9OT05fQk9VTkRBUlkgPSAiYXRfbm9uX2JvdW5kYXJ5IgogQVRfRU5EID0gImF0X2VuZCIKK0FUX0VORF9MSU5FID0gImF0X2VuZF9saW5lIgogCiAjIGNhdGVnb3JpZXMKLQogQ0FURUdPUllfRElHSVQgPSAiY2F0ZWdvcnlfZGlnaXQiCiBDQVRFR09SWV9OT1RfRElHSVQgPSAiY2F0ZWdvcnlfbm90X2RpZ2l0IgogQ0FURUdPUllfU1BBQ0UgPSAiY2F0ZWdvcnlfc3BhY2UiCiBDQVRFR09SWV9OT1RfU1BBQ0UgPSAiY2F0ZWdvcnlfbm90X3NwYWNlIgogQ0FURUdPUllfV09SRCA9ICJjYXRlZ29yeV93b3JkIgogQ0FURUdPUllfTk9UX1dPUkQgPSAiY2F0ZWdvcnlfbm90X3dvcmQiCitDQVRFR09SWV9MSU5FQlJFQUsgPSAiY2F0ZWdvcnlfbGluZWJyZWFrIgorQ0FURUdPUllfTk9UX0xJTkVCUkVBSyA9ICJjYXRlZ29yeV9ub3RfbGluZWJyZWFrIgorQ0FURUdPUllfTE9DX1dPUkQgPSAiY2F0ZWdvcnlfbG9jX3dvcmQiCitDQVRFR09SWV9MT0NfTk9UX1dPUkQgPSAiY2F0ZWdvcnlfbG9jX25vdF93b3JkIgorQ0FURUdPUllfVU5JX0RJR0lUID0gImNhdGVnb3J5X3VuaV9kaWdpdCIKK0NBVEVHT1JZX1VOSV9OT1RfRElHSVQgPSAiY2F0ZWdvcnlfdW5pX25vdF9kaWdpdCIKK0NBVEVHT1JZX1VOSV9TUEFDRSA9ICJjYXRlZ29yeV91bmlfc3BhY2UiCitDQVRFR09SWV9VTklfTk9UX1NQQUNFID0gImNhdGVnb3J5X3VuaV9ub3Rfc3BhY2UiCitDQVRFR09SWV9VTklfV09SRCA9ICJjYXRlZ29yeV91bmlfd29yZCIKK0NBVEVHT1JZX1VOSV9OT1RfV09SRCA9ICJjYXRlZ29yeV91bmlfbm90X3dvcmQiCitDQVRFR09SWV9VTklfTElORUJSRUFLID0gImNhdGVnb3J5X3VuaV9saW5lYnJlYWsiCitDQVRFR09SWV9VTklfTk9UX0xJTkVCUkVBSyA9ICJjYXRlZ29yeV91bmlfbm90X2xpbmVicmVhayIKIAotQ09ERVMgPSBbCitPUENPREVTID0gWwogCiAgICAgIyBmYWlsdXJlPTAgc3VjY2Vzcz0xIChqdXN0IGJlY2F1c2UgaXQgbG9va3MgYmV0dGVyIHRoYXQgd2F5IDotKQogICAgIEZBSUxVUkUsIFNVQ0NFU1MsCkBAIC03NCwxMiArODgsMTMgQEAKICAgICBDQVRFR09SWSwKICAgICBHUk9VUCwgR1JPVVBfSUdOT1JFLAogICAgIElOLCBJTl9JR05PUkUsCisgICAgSU5GTywKICAgICBKVU1QLAogICAgIExJVEVSQUwsIExJVEVSQUxfSUdOT1JFLAogICAgIE1BUkssCi0gICAgTUFYX1JFUEVBVCwgTUFYX1VOVElMLAorICAgIE1BWF9SRVBFQVQsCiAgICAgTUFYX1JFUEVBVF9PTkUsCi0gICAgTUlOX1JFUEVBVCwgTUlOX1VOVElMLAorICAgIE1JTl9SRVBFQVQsCiAgICAgTk9UX0xJVEVSQUwsIE5PVF9MSVRFUkFMX0lHTk9SRSwKICAgICBORUdBVEUsCiAgICAgUkFOR0UsCkBAIC04Nyw0NSArMTAyLDk1IEBACiAKIF0KIAotIyBjb252ZXJ0IHRvIGRpY3Rpb25hcnkKLWMgPSB7fQotaSA9IDAKLWZvciBjb2RlIGluIENPREVTOgotICAgIGNbY29kZV0gPSBpCi0gICAgaSA9IGkgKyAxCi1DT0RFUyA9IGMKK0FUQ09ERVMgPSBbCisgICAgQVRfQkVHSU5OSU5HLCBBVF9CRUdJTk5JTkdfTElORSwgQVRfQk9VTkRBUlksCisgICAgQVRfTk9OX0JPVU5EQVJZLCBBVF9FTkQsIEFUX0VORF9MSU5FCitdCisKK0NIQ09ERVMgPSBbCisgICAgQ0FURUdPUllfRElHSVQsIENBVEVHT1JZX05PVF9ESUdJVCwgQ0FURUdPUllfU1BBQ0UsCisgICAgQ0FURUdPUllfTk9UX1NQQUNFLCBDQVRFR09SWV9XT1JELCBDQVRFR09SWV9OT1RfV09SRCwKKyAgICBDQVRFR09SWV9MSU5FQlJFQUssIENBVEVHT1JZX05PVF9MSU5FQlJFQUssIENBVEVHT1JZX0xPQ19XT1JELAorICAgIENBVEVHT1JZX0xPQ19OT1RfV09SRCwgQ0FURUdPUllfVU5JX0RJR0lULCBDQVRFR09SWV9VTklfTk9UX0RJR0lULAorICAgIENBVEVHT1JZX1VOSV9TUEFDRSwgQ0FURUdPUllfVU5JX05PVF9TUEFDRSwgQ0FURUdPUllfVU5JX1dPUkQsCisgICAgQ0FURUdPUllfVU5JX05PVF9XT1JELCBDQVRFR09SWV9VTklfTElORUJSRUFLLAorICAgIENBVEVHT1JZX1VOSV9OT1RfTElORUJSRUFLCitdCisKK2RlZiBtYWtlZGljdChsaXN0KToKKyAgICBkID0ge30KKyAgICBpID0gMAorICAgIGZvciBpdGVtIGluIGxpc3Q6CisJZFtpdGVtXSA9IGkKKwlpID0gaSArIDEKKyAgICByZXR1cm4gZAorCitPUENPREVTID0gbWFrZWRpY3QoT1BDT0RFUykKK0FUQ09ERVMgPSBtYWtlZGljdChBVENPREVTKQorQ0hDT0RFUyA9IG1ha2VkaWN0KENIQ09ERVMpCiAKICMgcmVwbGFjZW1lbnQgb3BlcmF0aW9ucyBmb3IgImlnbm9yZSBjYXNlIiBtb2RlCi1NQVBfSUdOT1JFID0geworT1BfSUdOT1JFID0gewogICAgIEdST1VQOiBHUk9VUF9JR05PUkUsCiAgICAgSU46IElOX0lHTk9SRSwKICAgICBMSVRFUkFMOiBMSVRFUkFMX0lHTk9SRSwKICAgICBOT1RfTElURVJBTDogTk9UX0xJVEVSQUxfSUdOT1JFCiB9CiAKLVBPU0lUSU9OUyA9IHsKLSAgICBBVF9CRUdJTk5JTkc6IG9yZCgiYSIpLAotICAgIEFUX0JPVU5EQVJZOiBvcmQoImIiKSwKLSAgICBBVF9OT05fQk9VTkRBUlk6IG9yZCgiQiIpLAotICAgIEFUX0VORDogb3JkKCJ6IiksCitBVF9NVUxUSUxJTkUgPSB7CisgICAgQVRfQkVHSU5OSU5HOiBBVF9CRUdJTk5JTkdfTElORSwKKyAgICBBVF9FTkQ6IEFUX0VORF9MSU5FCiB9CiAKLUNBVEVHT1JJRVMgPSB7Ci0gICAgQ0FURUdPUllfRElHSVQ6IG9yZCgiZCIpLAotICAgIENBVEVHT1JZX05PVF9ESUdJVDogb3JkKCJEIiksCi0gICAgQ0FURUdPUllfU1BBQ0U6IG9yZCgicyIpLAotICAgIENBVEVHT1JZX05PVF9TUEFDRTogb3JkKCJTIiksCi0gICAgQ0FURUdPUllfV09SRDogb3JkKCJ3IiksCi0gICAgQ0FURUdPUllfTk9UX1dPUkQ6IG9yZCgiVyIpLAorQ0hfTE9DQUxFID0geworICAgIENBVEVHT1JZX0RJR0lUOiBDQVRFR09SWV9ESUdJVCwKKyAgICBDQVRFR09SWV9OT1RfRElHSVQ6IENBVEVHT1JZX05PVF9ESUdJVCwKKyAgICBDQVRFR09SWV9TUEFDRTogQ0FURUdPUllfU1BBQ0UsCisgICAgQ0FURUdPUllfTk9UX1NQQUNFOiBDQVRFR09SWV9OT1RfU1BBQ0UsCisgICAgQ0FURUdPUllfV09SRDogQ0FURUdPUllfTE9DX1dPUkQsCisgICAgQ0FURUdPUllfTk9UX1dPUkQ6IENBVEVHT1JZX0xPQ19OT1RfV09SRCwKKyAgICBDQVRFR09SWV9MSU5FQlJFQUs6IENBVEVHT1JZX0xJTkVCUkVBSywKKyAgICBDQVRFR09SWV9OT1RfTElORUJSRUFLOiBDQVRFR09SWV9OT1RfTElORUJSRUFLCiB9CiAKK0NIX1VOSUNPREUgPSB7CisgICAgQ0FURUdPUllfRElHSVQ6IENBVEVHT1JZX1VOSV9ESUdJVCwKKyAgICBDQVRFR09SWV9OT1RfRElHSVQ6IENBVEVHT1JZX1VOSV9OT1RfRElHSVQsCisgICAgQ0FURUdPUllfU1BBQ0U6IENBVEVHT1JZX1VOSV9TUEFDRSwKKyAgICBDQVRFR09SWV9OT1RfU1BBQ0U6IENBVEVHT1JZX1VOSV9OT1RfU1BBQ0UsCisgICAgQ0FURUdPUllfV09SRDogQ0FURUdPUllfVU5JX1dPUkQsCisgICAgQ0FURUdPUllfTk9UX1dPUkQ6IENBVEVHT1JZX1VOSV9OT1RfV09SRCwKKyAgICBDQVRFR09SWV9MSU5FQlJFQUs6IENBVEVHT1JZX1VOSV9MSU5FQlJFQUssCisgICAgQ0FURUdPUllfTk9UX0xJTkVCUkVBSzogQ0FURUdPUllfVU5JX05PVF9MSU5FQlJFQUsKK30KKworIyBmbGFncworU1JFX0ZMQUdfVEVNUExBVEUgPSAxCitTUkVfRkxBR19JR05PUkVDQVNFID0gMgorU1JFX0ZMQUdfTE9DQUxFID0gNAorU1JFX0ZMQUdfTVVMVElMSU5FID0gOAorU1JFX0ZMQUdfRE9UQUxMID0gMTYKK1NSRV9GTEFHX1VOSUNPREUgPSAzMgorU1JFX0ZMQUdfVkVSQk9TRSA9IDY0CisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgaW1wb3J0IHN0cmluZwotICAgIGl0ZW1zID0gQ09ERVMuaXRlbXMoKQotICAgIGl0ZW1zLnNvcnQobGFtYmRhIGEsIGI6IGNtcChhWzFdLCBiWzFdKSkKKyAgICBkZWYgZHVtcChmLCBkLCBwcmVmaXgpOgorCWl0ZW1zID0gZC5pdGVtcygpCisJaXRlbXMuc29ydChsYW1iZGEgYSwgYjogY21wKGFbMV0sIGJbMV0pKQorCWZvciBrLCB2IGluIGl0ZW1zOgorCSAgICBmLndyaXRlKCIjZGVmaW5lICVzXyVzICVzXG4iICUgKHByZWZpeCwgc3RyaW5nLnVwcGVyKGspLCB2KSkKICAgICBmID0gb3Blbigic3JlX2NvbnN0YW50cy5oIiwgInciKQotICAgIGYud3JpdGUoIi8qIGdlbmVyYXRlZCBieSBzcmVfY29uc3RhbnRzLnB5ICovXG4iKQotICAgIGZvciBrLCB2IGluIGl0ZW1zOgotCWYud3JpdGUoIiNkZWZpbmUgU1JFX09QXyIgKyBzdHJpbmcudXBwZXIoaykgKyAiICIgKyBzdHIodikgKyAiXG4iKQorICAgIGYud3JpdGUoIi8qIGdlbmVyYXRlZCBmcm9tIHNyZV9jb25zdGFudHMucHkgKi9cbiIpCisgICAgZHVtcChmLCBPUENPREVTLCAiU1JFX09QIikKKyAgICBkdW1wKGYsIEFUQ09ERVMsICJTUkUiKQorICAgIGR1bXAoZiwgQ0hDT0RFUywgIlNSRSIpCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfRkxBR19URU1QTEFURSAlZFxuIiAlIFNSRV9GTEFHX1RFTVBMQVRFKQorICAgIGYud3JpdGUoIiNkZWZpbmUgU1JFX0ZMQUdfSUdOT1JFQ0FTRSAlZFxuIiAlIFNSRV9GTEFHX0lHTk9SRUNBU0UpCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfRkxBR19MT0NBTEUgJWRcbiIgJSBTUkVfRkxBR19MT0NBTEUpCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfRkxBR19NVUxUSUxJTkUgJWRcbiIgJSBTUkVfRkxBR19NVUxUSUxJTkUpCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfRkxBR19ET1RBTEwgJWRcbiIgJSBTUkVfRkxBR19ET1RBTEwpCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfRkxBR19VTklDT0RFICVkXG4iICUgU1JFX0ZMQUdfVU5JQ09ERSkKKyAgICBmLndyaXRlKCIjZGVmaW5lIFNSRV9GTEFHX1ZFUkJPU0UgJWRcbiIgJSBTUkVfRkxBR19WRVJCT1NFKQogICAgIGYuY2xvc2UoKQogICAgIHByaW50ICJkb25lIgpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvc3JlX3BhcnMucHkgYi9MaWIvZG9zLTh4My9zcmVfcGFycy5weQppbmRleCA4YjY4ZWExLi45M2E3YjVkIDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My9zcmVfcGFycy5weQorKysgYi9MaWIvZG9zLTh4My9zcmVfcGFycy5weQpAQCAtMSwzNyArMSwzNCBAQAogIwogIyBTZWNyZXQgTGFicycgUmVndWxhciBFeHByZXNzaW9uIEVuZ2luZQotIyAkSWQkCiAjCi0jIGNvbnZlcnQgcmUtc3R5bGUgcmVndWxhciBleHByZXNzaW9uIHRvIFNSRSB0ZW1wbGF0ZS4gIHRoZSBjdXJyZW50Ci0jIGltcGxlbWVudGF0aW9uIGlzIHNvbWV3aGF0IGluY29tcGxldGUsIGFuZCBub3QgdmVyeSBmYXN0LiAgc2hvdWxkCi0jIGRlZmluaXRlbHkgYmUgcmV3cml0dGVuIGJlZm9yZSBQeXRob24gMS42IGdvZXMgYmV0YS4KKyMgY29udmVydCByZS1zdHlsZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc3JlIHBhdHRlcm4KICMKICMgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgYnkgU2VjcmV0IExhYnMgQUIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogIwotIyBUaGlzIGNvZGUgY2FuIG9ubHkgYmUgdXNlZCBmb3IgMS42IGFscGhhIHRlc3RpbmcuICBBbGwgb3RoZXIgdXNlCi0jIHJlcXVpcmUgZXhwbGljaXQgcGVybWlzc2lvbiBmcm9tIFNlY3JldCBMYWJzIEFCLgotIwogIyBQb3J0aW9ucyBvZiB0aGlzIGVuZ2luZSBoYXZlIGJlZW4gZGV2ZWxvcGVkIGluIGNvb3BlcmF0aW9uIHdpdGgKICMgQ05SSS4gIEhld2xldHQtUGFja2FyZCBwcm92aWRlZCBmdW5kaW5nIGZvciAxLjYgaW50ZWdyYXRpb24gYW5kCiAjIG90aGVyIGNvbXBhdGliaWxpdHkgd29yay4KICMKIAotIyBGSVhNRTogY29tbWVudHMgbWFya2VkIHdpdGggdGhlIEZJWE1FIHRhZyBhcmUgb3BlbiBpc3N1ZXMuICBhbGwgc3VjaAotIyBpc3N1ZXMgc2hvdWxkIGJlIGNsb3NlZCBiZWZvcmUgdGhlIGZpbmFsIGJldGEuCi0KIGltcG9ydCBzdHJpbmcsIHN5cwogCitpbXBvcnQgX3NyZQorCiBmcm9tIHNyZV9jb25zdGFudHMgaW1wb3J0ICoKIAorIyBGSVhNRTogc2hvdWxkIGJlIDY1NTM1LCBidXQgdGhlIGFycmF5bW9kdWxlIGlzIHN0aWxsIGJyb2tlbgorTUFYUkVQRUFUID0gMzI3NjcKKwogU1BFQ0lBTF9DSEFSUyA9ICIuXFxbeygpKis/XiR8IgogUkVQRUFUX0NIQVJTICA9ICIqKz97IgogCi0jIEZJWE1FOiBzdHJpbmcgaW4gdHVwbGUgdGVzdHMgbWF5IGV4cGxvZGUgd2l0aCBpZiBjaGFyIGlzIHVuaWNvZGUgOi0oCiBESUdJVFMgPSB0dXBsZShzdHJpbmcuZGlnaXRzKQogCiBPQ1RESUdJVFMgPSB0dXBsZSgiMDEyMzQ1NjciKQogSEVYRElHSVRTID0gdHVwbGUoIjAxMjM0NTY3ODlhYmNkZWZBQkNERUYiKQogCitXSElURVNQQUNFID0gc3RyaW5nLndoaXRlc3BhY2UKKwogRVNDQVBFUyA9IHsKICAgICAiXFxhIjogKExJVEVSQUwsIGNocig3KSksCiAgICAgIlxcYiI6IChMSVRFUkFMLCBjaHIoOCkpLApAQCAtNTUsMTAgKzUyLDIxIEBACiAgICAgIlxcWiI6IChBVCwgQVRfRU5EKSwgIyBlbmQgb2Ygc3RyaW5nCiB9CiAKLWNsYXNzIFBhdHRlcm46Ci0gICAgIyBGSVhNRTogPGZsPiByZW5hbWUgY2xhc3MsIGFuZCBzdG9yZSBmbGFncyBpbiBoZXJlIHRvbyEKK0ZMQUdTID0geworICAgICMgc3RhbmRhcmQgZmxhZ3MKKyAgICAiaSI6IFNSRV9GTEFHX0lHTk9SRUNBU0UsCisgICAgIkwiOiBTUkVfRkxBR19MT0NBTEUsCisgICAgIm0iOiBTUkVfRkxBR19NVUxUSUxJTkUsCisgICAgInMiOiBTUkVfRkxBR19ET1RBTEwsCisgICAgIngiOiBTUkVfRkxBR19WRVJCT1NFLAorICAgICMgZXh0ZW5zaW9ucworICAgICJ0IjogU1JFX0ZMQUdfVEVNUExBVEUsCisgICAgInUiOiBTUkVfRkxBR19VTklDT0RFLAorfQorCitjbGFzcyBTdGF0ZToKICAgICBkZWYgX19pbml0X18oc2VsZik6Ci0Jc2VsZi5mbGFncyA9IFtdCisJc2VsZi5mbGFncyA9IDAKIAlzZWxmLmdyb3VwcyA9IDEKIAlzZWxmLmdyb3VwZGljdCA9IHt9CiAgICAgZGVmIGdldGdyb3VwKHNlbGYsIG5hbWU9Tm9uZSk6CkBAIC02Nyw5ICs3NSw2IEBACiAJaWYgbmFtZToKIAkgICAgc2VsZi5ncm91cGRpY3RbbmFtZV0gPSBnaWQKIAlyZXR1cm4gZ2lkCi0gICAgZGVmIHNldGZsYWcoc2VsZiwgZmxhZyk6Ci0JaWYgZmxhZyBpbiBzZWxmLmZsYWdzOgotCSAgICBzZWxmLmZsYWdzLmFwcGVuZChmbGFnKQogCiBjbGFzcyBTdWJQYXR0ZXJuOgogICAgICMgYSBzdWJwYXR0ZXJuLCBpbiBpbnRlcm1lZGlhdGUgZm9ybQpAQCAtNzgsNyArODMsNiBAQAogCWlmIG5vdCBkYXRhOgogCSAgICBkYXRhID0gW10KIAlzZWxmLmRhdGEgPSBkYXRhCi0Jc2VsZi5mbGFncyA9IFtdCiAJc2VsZi53aWR0aCA9IE5vbmUKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAJcmV0dXJuIHJlcHIoc2VsZi5kYXRhKQpAQCAtMTIxLDggKzEyNSw4IEBACiAJCWhpID0gaGkgKyBqCiAJICAgIGVsaWYgb3AgaW4gKE1JTl9SRVBFQVQsIE1BWF9SRVBFQVQpOgogCQlpLCBqID0gYXZbMl0uZ2V0d2lkdGgoKQotCQlsbyA9IGxvICsgaSAqIGF2WzBdCi0JCWhpID0gaGkgKyBqICogYXZbMV0KKwkJbG8gPSBsbyArIGxvbmcoaSkgKiBhdlswXQorCQloaSA9IGhpICsgbG9uZyhqKSAqIGF2WzFdCiAJICAgIGVsaWYgb3AgaW4gKEFOWSwgUkFOR0UsIElOLCBMSVRFUkFMLCBOT1RfTElURVJBTCwgQ0FURUdPUlkpOgogCQlsbyA9IGxvICsgMQogCQloaSA9IGhpICsgMQpAQCAtMTMwLDQ3ICsxMzQsMjMgQEAKIAkJYnJlYWsKIAlzZWxmLndpZHRoID0gaW50KG1pbihsbywgc3lzLm1heGludCkpLCBpbnQobWluKGhpLCBzeXMubWF4aW50KSkKIAlyZXR1cm4gc2VsZi53aWR0aAotICAgIGRlZiBzZXQoc2VsZiwgZmxhZyk6Ci0JaWYgbm90IGZsYWcgaW4gc2VsZi5mbGFnczoKLQkgICAgc2VsZi5mbGFncy5hcHBlbmQoZmxhZykKLSAgICBkZWYgcmVzZXQoc2VsZiwgZmxhZyk6Ci0JaWYgZmxhZyBpbiBzZWxmLmZsYWdzOgotCSAgICBzZWxmLmZsYWdzLnJlbW92ZShmbGFnKQogCiBjbGFzcyBUb2tlbml6ZXI6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmluZyk6Ci0Jc2VsZi5zdHJpbmcgPSBsaXN0KHN0cmluZykKKwlzZWxmLmluZGV4ID0gMAorCXNlbGYuc3RyaW5nID0gc3RyaW5nCiAJc2VsZi5uZXh0ID0gc2VsZi5fX25leHQoKQogICAgIGRlZiBfX25leHQoc2VsZik6Ci0JaWYgbm90IHNlbGYuc3RyaW5nOgorCWlmIHNlbGYuaW5kZXggPj0gbGVuKHNlbGYuc3RyaW5nKToKIAkgICAgcmV0dXJuIE5vbmUKLQljaGFyID0gc2VsZi5zdHJpbmdbMF0KKwljaGFyID0gc2VsZi5zdHJpbmdbc2VsZi5pbmRleF0KIAlpZiBjaGFyWzBdID09ICJcXCI6CiAJICAgIHRyeToKLQkJYyA9IHNlbGYuc3RyaW5nWzFdCisJCWMgPSBzZWxmLnN0cmluZ1tzZWxmLmluZGV4ICsgMV0KIAkgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0JCXJhaXNlIFN5bnRheEVycm9yLCAiYm9ndXMgZXNjYXBlIgorCQlyYWlzZSBlcnJvciwgImJvZ3VzIGVzY2FwZSIKIAkgICAgY2hhciA9IGNoYXIgKyBjCi0JICAgIHRyeToKLQkJaWYgYyA9PSAieCI6Ci0JCSAgICAjIGhleGFkZWNpbWFsIGNvbnN0YW50Ci0JCSAgICBmb3IgaSBpbiB4cmFuZ2UoMiwgc3lzLm1heGludCk6Ci0JCQljID0gc2VsZi5zdHJpbmdbaV0KLQkJCWlmIHN0cihjKSBub3QgaW4gSEVYRElHSVRTOgotCQkJICAgIGJyZWFrCi0JCQljaGFyID0gY2hhciArIGMKLQkJZWxpZiBzdHIoYykgaW4gRElHSVRTOgotCQkgICAgIyBkZWNpbWFsIChvciBvY3RhbCkgbnVtYmVyCi0JCSAgICBmb3IgaSBpbiB4cmFuZ2UoMiwgc3lzLm1heGludCk6Ci0JCQljID0gc2VsZi5zdHJpbmdbaV0KLQkJCSMgRklYTUU6IGlmIGxhcmdlciB0aGFuIGN1cnJlbnQgbnVtYmVyIG9mCi0JCQkjIGdyb3VwcywgaW50ZXJwcmV0IGFzIGFuIG9jdGFsIG51bWJlciAKLQkJCWlmIHN0cihjKSBub3QgaW4gRElHSVRTOgotCQkJICAgIGJyZWFrCi0JCQljaGFyID0gY2hhciArIGMKLQkgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0JCXBhc3MgIyB1c2Ugd2hhdCB3ZSd2ZSBnb3QgdGhpcyBmYXIKLQlkZWwgc2VsZi5zdHJpbmdbMDpsZW4oY2hhcildCisJc2VsZi5pbmRleCA9IHNlbGYuaW5kZXggKyBsZW4oY2hhcikKIAlyZXR1cm4gY2hhcgogICAgIGRlZiBtYXRjaChzZWxmLCBjaGFyKToKIAlpZiBjaGFyID09IHNlbGYubmV4dDoKQEAgLTE4Nyw0NSArMTY3LDEwMyBAQAogCXNlbGYubmV4dCA9IHNlbGYuX19uZXh0KCkKIAlyZXR1cm4gdGhpcwogCi1kZWYgX2ZpeGVzY2FwZShlc2NhcGUsIGNoYXJhY3Rlcl9jbGFzcz0wKToKLSAgICAjIGNvbnZlcnQgZXNjYXBlIHRvICh0eXBlLCB2YWx1ZSkKLSAgICBpZiBjaGFyYWN0ZXJfY2xhc3M6Ci0JIyBpbnNpZGUgYSBjaGFyYWN0ZXIgY2xhc3MsIHdlJ2xsIGxvb2sgaW4gdGhlIGNoYXJhY3RlcgotCSMgZXNjYXBlcyBkaWN0aW9uYXJ5IGZpcnN0Ci0JY29kZSA9IEVTQ0FQRVMuZ2V0KGVzY2FwZSkKLQlpZiBjb2RlOgotCSAgICByZXR1cm4gY29kZQotCWNvZGUgPSBDQVRFR09SSUVTLmdldChlc2NhcGUpCi0gICAgZWxzZToKLQljb2RlID0gQ0FURUdPUklFUy5nZXQoZXNjYXBlKQotCWlmIGNvZGU6Ci0JICAgIHJldHVybiBjb2RlCi0JY29kZSA9IEVTQ0FQRVMuZ2V0KGVzY2FwZSkKK2RlZiBpc2lkZW50KGNoYXIpOgorICAgIHJldHVybiAiYSIgPD0gY2hhciA8PSAieiIgb3IgIkEiIDw9IGNoYXIgPD0gIloiIG9yIGNoYXIgPT0gIl8iCisKK2RlZiBpc2RpZ2l0KGNoYXIpOgorICAgIHJldHVybiAiMCIgPD0gY2hhciA8PSAiOSIKKworZGVmIGlzbmFtZShuYW1lKToKKyAgICAjIGNoZWNrIHRoYXQgZ3JvdXAgbmFtZSBpcyBhIHZhbGlkIHN0cmluZworICAgICMgRklYTUU6IDxmbD4gdGhpcyBjb2RlIGlzIHJlYWxseSBsYW1lLiAgc2hvdWxkIHVzZSBhIHJlZ3VsYXIKKyAgICAjIGV4cHJlc3Npb24gaW5zdGVhZCwgYnV0IEkgc2VlbSB0byBoYXZlIGNlcnRhaW4gYm9vdHN0cmFwcGluZworICAgICMgcHJvYmxlbXMgaGVyZSA7LSkKKyAgICBpZiBub3QgaXNpZGVudChuYW1lWzBdKToKKwlyZXR1cm4gMAorICAgIGZvciBjaGFyIGluIG5hbWU6CisJaWYgbm90IGlzaWRlbnQoY2hhcikgYW5kIG5vdCBpc2RpZ2l0KGNoYXIpOgorCSAgICByZXR1cm4gMAorICAgIHJldHVybiAxCisKK2RlZiBfZ3JvdXAoZXNjYXBlLCBzdGF0ZSk6CisgICAgIyBjaGVjayBpZiB0aGUgZXNjYXBlIHN0cmluZyByZXByZXNlbnRzIGEgdmFsaWQgZ3JvdXAKKyAgICB0cnk6CisJZ3JvdXAgPSBpbnQoZXNjYXBlWzE6XSkKKwlpZiBncm91cCBhbmQgZ3JvdXAgPCBzdGF0ZS5ncm91cHM6CisJICAgIHJldHVybiBncm91cAorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorCXBhc3MKKyAgICByZXR1cm4gTm9uZSAjIG5vdCBhIHZhbGlkIGdyb3VwCisKK2RlZiBfY2xhc3NfZXNjYXBlKHNvdXJjZSwgZXNjYXBlKToKKyAgICAjIGhhbmRsZSBlc2NhcGUgY29kZSBpbnNpZGUgY2hhcmFjdGVyIGNsYXNzCisgICAgY29kZSA9IEVTQ0FQRVMuZ2V0KGVzY2FwZSkKICAgICBpZiBjb2RlOgogCXJldHVybiBjb2RlCi0gICAgaWYgbm90IGNoYXJhY3Rlcl9jbGFzczoKLQl0cnk6Ci0JICAgIGdyb3VwID0gaW50KGVzY2FwZVsxOl0pCi0JICAgICMgRklYTUU6IG9ubHkgdmFsaWQgaWYgZ3JvdXAgPD0gY3VycmVudCBudW1iZXIgb2YgZ3JvdXBzCi0JICAgIHJldHVybiBHUk9VUCwgZ3JvdXAKLQlleGNlcHQgVmFsdWVFcnJvcjoKLQkgICAgcGFzcworICAgIGNvZGUgPSBDQVRFR09SSUVTLmdldChlc2NhcGUpCisgICAgaWYgY29kZToKKwlyZXR1cm4gY29kZQogICAgIHRyeToKIAlpZiBlc2NhcGVbMToyXSA9PSAieCI6CisJICAgIHdoaWxlIHNvdXJjZS5uZXh0IGluIEhFWERJR0lUUzoKKwkJZXNjYXBlID0gZXNjYXBlICsgc291cmNlLmdldCgpCiAJICAgIGVzY2FwZSA9IGVzY2FwZVsyOl0KLQkgICAgcmV0dXJuIExJVEVSQUwsIGNocihpbnQoZXNjYXBlWy0yOl0sIDE2KSAmIDB4ZmYpCi0JZWxpZiBzdHIoZXNjYXBlWzE6Ml0pIGluIERJR0lUUzoKLQkgICAgcmV0dXJuIExJVEVSQUwsIGNocihpbnQoZXNjYXBlWzE6XSwgOCkgJiAweGZmKQotCWVsaWYgbGVuKGVzY2FwZSkgPT0gMjoKKwkgICAgIyBGSVhNRTogc3VwcG9ydCB1bmljb2RlIGNoYXJhY3RlcnMhCisJICAgIHJldHVybiBMSVRFUkFMLCBjaHIoaW50KGVzY2FwZVstNDpdLCAxNikgJiAweGZmKQorCWVsaWYgc3RyKGVzY2FwZVsxOjJdKSBpbiBPQ1RESUdJVFM6CisJICAgIHdoaWxlIHNvdXJjZS5uZXh0IGluIE9DVERJR0lUUzoKKwkJZXNjYXBlID0gZXNjYXBlICsgc291cmNlLmdldCgpCisJICAgIGVzY2FwZSA9IGVzY2FwZVsxOl0KKwkgICAgIyBGSVhNRTogc3VwcG9ydCB1bmljb2RlIGNoYXJhY3RlcnMhCisJICAgIHJldHVybiBMSVRFUkFMLCBjaHIoaW50KGVzY2FwZVstNjpdLCA4KSAmIDB4ZmYpCisJaWYgbGVuKGVzY2FwZSkgPT0gMjoKIAkgICAgcmV0dXJuIExJVEVSQUwsIGVzY2FwZVsxXQogICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogCXBhc3MKLSAgICByYWlzZSBTeW50YXhFcnJvciwgImJvZ3VzIGVzY2FwZTogJXMiICUgcmVwcihlc2NhcGUpCisgICAgcmFpc2UgZXJyb3IsICJib2d1cyBlc2NhcGU6ICVzIiAlIHJlcHIoZXNjYXBlKQogCi1kZWYgX2JyYW5jaChzdWJwYXR0ZXJuLCBpdGVtcyk6CitkZWYgX2VzY2FwZShzb3VyY2UsIGVzY2FwZSwgc3RhdGUpOgorICAgICMgaGFuZGxlIGVzY2FwZSBjb2RlIGluIGV4cHJlc3Npb24KKyAgICBjb2RlID0gQ0FURUdPUklFUy5nZXQoZXNjYXBlKQorICAgIGlmIGNvZGU6CisJcmV0dXJuIGNvZGUKKyAgICBjb2RlID0gRVNDQVBFUy5nZXQoZXNjYXBlKQorICAgIGlmIGNvZGU6CisJcmV0dXJuIGNvZGUKKyAgICB0cnk6CisJaWYgZXNjYXBlWzE6Ml0gPT0gIngiOgorCSAgICB3aGlsZSBzb3VyY2UubmV4dCBpbiBIRVhESUdJVFM6CisJCWVzY2FwZSA9IGVzY2FwZSArIHNvdXJjZS5nZXQoKQorCSAgICBlc2NhcGUgPSBlc2NhcGVbMjpdCisJICAgICMgRklYTUU6IHN1cHBvcnQgdW5pY29kZSBjaGFyYWN0ZXJzIQorCSAgICByZXR1cm4gTElURVJBTCwgY2hyKGludChlc2NhcGVbLTQ6XSwgMTYpICYgMHhmZikKKwllbGlmIGVzY2FwZVsxOjJdIGluIERJR0lUUzoKKwkgICAgd2hpbGUgMToKKwkJZ3JvdXAgPSBfZ3JvdXAoZXNjYXBlLCBzdGF0ZSkKKwkJaWYgZ3JvdXA6CisJCSAgICBpZiAobm90IHNvdXJjZS5uZXh0IG9yCisJCQlub3QgX2dyb3VwKGVzY2FwZSArIHNvdXJjZS5uZXh0LCBzdGF0ZSkpOgorCQkgICAgICAgIHJldHVybiBHUk9VUCwgZ3JvdXAKKwkJICAgIGVzY2FwZSA9IGVzY2FwZSArIHNvdXJjZS5nZXQoKQorCQllbGlmIHNvdXJjZS5uZXh0IGluIE9DVERJR0lUUzoKKwkJICAgIGVzY2FwZSA9IGVzY2FwZSArIHNvdXJjZS5nZXQoKQorCQllbHNlOgorCQkgICAgYnJlYWsKKwkgICAgZXNjYXBlID0gZXNjYXBlWzE6XQorCSAgICAjIEZJWE1FOiBzdXBwb3J0IHVuaWNvZGUgY2hhcmFjdGVycyEKKwkgICAgcmV0dXJuIExJVEVSQUwsIGNocihpbnQoZXNjYXBlWy02Ol0sIDgpICYgMHhmZikKKwlpZiBsZW4oZXNjYXBlKSA9PSAyOgorCSAgICByZXR1cm4gTElURVJBTCwgZXNjYXBlWzFdCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisJcGFzcworICAgIHJhaXNlIGVycm9yLCAiYm9ndXMgZXNjYXBlOiAlcyIgJSByZXByKGVzY2FwZSkKIAotICAgICMgZm9ybSBhIGJyYW5jaCBvcGVyYXRvciBmcm9tIGEgc2V0IG9mIGl0ZW1zIChGSVhNRTogbW92ZSB0aGlzCi0gICAgIyBvcHRpbWl6YXRpb24gdG8gdGhlIGNvbXBpbGVyIG1vZHVsZSEpCisKK2RlZiBfYnJhbmNoKHBhdHRlcm4sIGl0ZW1zKToKKworICAgICMgZm9ybSBhIGJyYW5jaCBvcGVyYXRvciBmcm9tIGEgc2V0IG9mIGl0ZW1zCisKKyAgICBzdWJwYXR0ZXJuID0gU3ViUGF0dGVybihwYXR0ZXJuKQogCiAgICAgIyBjaGVjayBpZiBhbGwgaXRlbXMgc2hhcmUgYSBjb21tb24gcHJlZml4CiAgICAgd2hpbGUgMToKQEAgLTI1NywyNiArMjk1LDM2IEBACiAJZm9yIGl0ZW0gaW4gaXRlbXM6CiAJICAgIHNldC5hcHBlbmQoaXRlbVswXSkKIAlzdWJwYXR0ZXJuLmFwcGVuZCgoSU4sIHNldCkpCi0JcmV0dXJuCisJcmV0dXJuIHN1YnBhdHRlcm4KIAogICAgIHN1YnBhdHRlcm4uYXBwZW5kKChCUkFOQ0gsIChOb25lLCBpdGVtcykpKQorICAgIHJldHVybiBzdWJwYXR0ZXJuCiAKLWRlZiBfcGFyc2Uoc291cmNlLCBwYXR0ZXJuLCBmbGFncz0oKSk6CitkZWYgX3BhcnNlKHNvdXJjZSwgc3RhdGUsIGZsYWdzPTApOgogCiAgICAgIyBwYXJzZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiBpbnRvIGFuIG9wZXJhdG9yIGxpc3QuCiAKLSAgICBzdWJwYXR0ZXJuID0gU3ViUGF0dGVybihwYXR0ZXJuKQotCi0gICAgdGhpcyA9IE5vbmUKKyAgICBzdWJwYXR0ZXJuID0gU3ViUGF0dGVybihzdGF0ZSkKIAogICAgIHdoaWxlIDE6CiAKLQlpZiBzdHIoc291cmNlLm5leHQpIGluICgifCIsICIpIik6CisJaWYgc291cmNlLm5leHQgaW4gKCJ8IiwgIikiKToKIAkgICAgYnJlYWsgIyBlbmQgb2Ygc3VicGF0dGVybgogCXRoaXMgPSBzb3VyY2UuZ2V0KCkKIAlpZiB0aGlzIGlzIE5vbmU6CiAJICAgIGJyZWFrICMgZW5kIG9mIHBhdHRlcm4KIAorCWlmIHN0YXRlLmZsYWdzICYgU1JFX0ZMQUdfVkVSQk9TRToKKwkgICAgIyBza2lwIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzCisJICAgIGlmIHRoaXMgaW4gV0hJVEVTUEFDRToKKwkJY29udGludWUKKwkgICAgaWYgdGhpcyA9PSAiIyI6CisJCXdoaWxlIDE6CisJCSAgICB0aGlzID0gc291cmNlLmdldCgpCisJCSAgICBpZiB0aGlzIGluIChOb25lLCAiXG4iKToKKwkJCWJyZWFrCisJCWNvbnRpbnVlCisKIAlpZiB0aGlzIGFuZCB0aGlzWzBdIG5vdCBpbiBTUEVDSUFMX0NIQVJTOgogCSAgICBzdWJwYXR0ZXJuLmFwcGVuZCgoTElURVJBTCwgdGhpcykpCiAKQEAgLTI5NCwxMSArMzQyLDExIEBACiAJCWlmIHRoaXMgPT0gIl0iIGFuZCBzZXQgIT0gc3RhcnQ6CiAJCSAgICBicmVhawogCQllbGlmIHRoaXMgYW5kIHRoaXNbMF0gPT0gIlxcIjoKLQkJICAgIGNvZGUxID0gX2ZpeGVzY2FwZSh0aGlzLCAxKQorCQkgICAgY29kZTEgPSBfY2xhc3NfZXNjYXBlKHNvdXJjZSwgdGhpcykKIAkJZWxpZiB0aGlzOgogCQkgICAgY29kZTEgPSBMSVRFUkFMLCB0aGlzCiAJCWVsc2U6Ci0JCSAgICByYWlzZSBTeW50YXhFcnJvciwgInVuZXhwZWN0ZWQgZW5kIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiIKKwkJICAgIHJhaXNlIGVycm9yLCAidW5leHBlY3RlZCBlbmQgb2YgcmVndWxhciBleHByZXNzaW9uIgogCQlpZiBzb3VyY2UubWF0Y2goIi0iKToKIAkJICAgICMgcG90ZW50aWFsIHJhbmdlCiAJCSAgICB0aGlzID0gc291cmNlLmdldCgpCkBAIC0zMDgsMjAgKzM1NiwyMCBAQAogCQkJYnJlYWsKIAkJICAgIGVsc2U6CiAJCQlpZiB0aGlzWzBdID09ICJcXCI6Ci0JCQkgICAgY29kZTIgPSBfZml4ZXNjYXBlKHRoaXMsIDEpCisJCQkgICAgY29kZTIgPSBfY2xhc3NfZXNjYXBlKHNvdXJjZSwgdGhpcykKIAkJCWVsc2U6CiAJCQkgICAgY29kZTIgPSBMSVRFUkFMLCB0aGlzCiAJCQlpZiBjb2RlMVswXSAhPSBMSVRFUkFMIG9yIGNvZGUyWzBdICE9IExJVEVSQUw6Ci0JCQkgICAgcmFpc2UgU3ludGF4RXJyb3IsICJpbGxlZ2FsIHJhbmdlIgorCQkJICAgIHJhaXNlIGVycm9yLCAiaWxsZWdhbCByYW5nZSIKIAkJCWlmIGxlbihjb2RlMVsxXSkgIT0gMSBvciBsZW4oY29kZTJbMV0pICE9IDE6Ci0JCQkgICAgcmFpc2UgU3ludGF4RXJyb3IsICJpbGxlZ2FsIHJhbmdlIgorCQkJICAgIHJhaXNlIGVycm9yLCAiaWxsZWdhbCByYW5nZSIKIAkJCXNldC5hcHBlbmQoKFJBTkdFLCAoY29kZTFbMV0sIGNvZGUyWzFdKSkpCiAJCWVsc2U6CiAJCSAgICBpZiBjb2RlMVswXSBpcyBJTjoKIAkJCWNvZGUxID0gY29kZTFbMV1bMF0KIAkJICAgIHNldC5hcHBlbmQoY29kZTEpCiAKLQkgICAgIyBGSVhNRTogPGZsPiBtb3ZlIHNldCBvcHRpbWl6YXRpb24gdG8gc3VwcG9ydCBmdW5jdGlvbgorCSAgICAjIEZJWE1FOiA8Zmw+IG1vdmUgc2V0IG9wdGltaXphdGlvbiB0byBjb21waWxlciEKIAkgICAgaWYgbGVuKHNldCk9PTEgYW5kIHNldFswXVswXSBpcyBMSVRFUkFMOgogCQlzdWJwYXR0ZXJuLmFwcGVuZChzZXRbMF0pICMgb3B0aW1pemF0aW9uCiAJICAgIGVsaWYgbGVuKHNldCk9PTIgYW5kIHNldFswXVswXSBpcyBORUdBVEUgYW5kIHNldFsxXVswXSBpcyBMSVRFUkFMOgpAQCAtMzM1LDQzICszODMsNDEgQEAKIAkgICAgaWYgdGhpcyA9PSAiPyI6CiAJCW1pbiwgbWF4ID0gMCwgMQogCSAgICBlbGlmIHRoaXMgPT0gIioiOgotCQltaW4sIG1heCA9IDAsIHN5cy5tYXhpbnQKKwkJbWluLCBtYXggPSAwLCBNQVhSRVBFQVQKIAkgICAgZWxpZiB0aGlzID09ICIrIjoKLQkJbWluLCBtYXggPSAxLCBzeXMubWF4aW50CisJCW1pbiwgbWF4ID0gMSwgTUFYUkVQRUFUCiAJICAgIGVsaWYgdGhpcyA9PSAieyI6Ci0JCW1pbiwgbWF4ID0gMCwgc3lzLm1heGludAorCQltaW4sIG1heCA9IDAsIE1BWFJFUEVBVAogCQlsbyA9IGhpID0gIiIKLQkJd2hpbGUgc3RyKHNvdXJjZS5uZXh0KSBpbiBESUdJVFM6CisJCXdoaWxlIHNvdXJjZS5uZXh0IGluIERJR0lUUzoKIAkJICAgIGxvID0gbG8gKyBzb3VyY2UuZ2V0KCkKIAkJaWYgc291cmNlLm1hdGNoKCIsIik6Ci0JCSAgICB3aGlsZSBzdHIoc291cmNlLm5leHQpIGluIERJR0lUUzoKKwkJICAgIHdoaWxlIHNvdXJjZS5uZXh0IGluIERJR0lUUzoKIAkJCWhpID0gaGkgKyBzb3VyY2UuZ2V0KCkKIAkJZWxzZToKIAkJICAgIGhpID0gbG8KIAkJaWYgbm90IHNvdXJjZS5tYXRjaCgifSIpOgotCQkgICAgcmFpc2UgU3ludGF4RXJyb3IsICJib2d1cyByYW5nZSIKKwkJICAgIHJhaXNlIGVycm9yLCAiYm9ndXMgcmFuZ2UiCiAJCWlmIGxvOgogCQkgICAgbWluID0gaW50KGxvKQogCQlpZiBoaToKIAkJICAgIG1heCA9IGludChoaSkKIAkJIyBGSVhNRTogPGZsPiBjaGVjayB0aGF0IGhpID49IGxvIQogCSAgICBlbHNlOgotCQlyYWlzZSBTeW50YXhFcnJvciwgIm5vdCBzdXBwb3J0ZWQiCisJCXJhaXNlIGVycm9yLCAibm90IHN1cHBvcnRlZCIKIAkgICAgIyBmaWd1cmUgb3V0IHdoaWNoIGl0ZW0gdG8gcmVwZWF0Ci0JICAgICMgRklYTUU6IHNob3VsZCBiYWNrIHVwIHRvIHRoZSByaWdodCBtYXJrLCByaWdodD8KIAkgICAgaWYgc3VicGF0dGVybjoKLQkJaW5kZXggPSBsZW4oc3VicGF0dGVybiktMQotCQl3aGlsZSBzdWJwYXR0ZXJuW2luZGV4XVswXSBpcyBNQVJLOgotCQkgICAgaW5kZXggPSBpbmRleCAtIDEKLQkJaXRlbSA9IHN1YnBhdHRlcm5baW5kZXg6aW5kZXgrMV0KKwkJaXRlbSA9IHN1YnBhdHRlcm5bLTE6XQogCSAgICBlbHNlOgotCQlyYWlzZSBTeW50YXhFcnJvciwgIm5vdGhpbmcgdG8gcmVwZWF0IgorCQlyYWlzZSBlcnJvciwgIm5vdGhpbmcgdG8gcmVwZWF0IgogCSAgICBpZiBzb3VyY2UubWF0Y2goIj8iKToKLQkJc3VicGF0dGVybltpbmRleF0gPSAoTUlOX1JFUEVBVCwgKG1pbiwgbWF4LCBpdGVtKSkKKwkJc3VicGF0dGVyblstMV0gPSAoTUlOX1JFUEVBVCwgKG1pbiwgbWF4LCBpdGVtKSkKIAkgICAgZWxzZToKLQkJc3VicGF0dGVybltpbmRleF0gPSAoTUFYX1JFUEVBVCwgKG1pbiwgbWF4LCBpdGVtKSkKKwkJc3VicGF0dGVyblstMV0gPSAoTUFYX1JFUEVBVCwgKG1pbiwgbWF4LCBpdGVtKSkKKwogCWVsaWYgdGhpcyA9PSAiLiI6CiAJICAgIHN1YnBhdHRlcm4uYXBwZW5kKChBTlksIE5vbmUpKQorCiAJZWxpZiB0aGlzID09ICIoIjoKIAkgICAgZ3JvdXAgPSAxCiAJICAgIG5hbWUgPSBOb25lCkBAIC0zNzksMjggKzQyNSw0MSBAQAogCQlncm91cCA9IDAKIAkJIyBvcHRpb25zCiAJCWlmIHNvdXJjZS5tYXRjaCgiUCIpOgotCQkgICAgIyBuYW1lZCBncm91cDogc2tpcCBmb3J3YXJkIHRvIGVuZCBvZiBuYW1lCisJCSAgICAjIHB5dGhvbiBleHRlbnNpb25zCiAJCSAgICBpZiBzb3VyY2UubWF0Y2goIjwiKToKKwkJCSMgbmFtZWQgZ3JvdXA6IHNraXAgZm9yd2FyZCB0byBlbmQgb2YgbmFtZQogCQkJbmFtZSA9ICIiCiAJCQl3aGlsZSAxOgogCQkJICAgIGNoYXIgPSBzb3VyY2UuZ2V0KCkKLQkJCSAgICBpZiBjaGFyIGlzIE5vbmUgb3IgY2hhciA9PSAiPiI6CisJCQkgICAgaWYgY2hhciBpcyBOb25lOgorCQkJCXJhaXNlIGVycm9yLCAidW50ZXJtaW5hdGVkIG5hbWUiCisJCQkgICAgaWYgY2hhciA9PSAiPiI6CiAJCQkJYnJlYWsKIAkJCSAgICBuYW1lID0gbmFtZSArIGNoYXIKIAkJCWdyb3VwID0gMQorCQkJaWYgbm90IGlzbmFtZShuYW1lKToKKwkJCSAgICByYWlzZSBlcnJvciwgImlsbGVnYWwgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUiCisJCSAgICBlbGlmIHNvdXJjZS5tYXRjaCgiPSIpOgorCQkJIyBuYW1lZCBiYWNrcmVmZXJlbmNlCisJCQlyYWlzZSBlcnJvciwgIm5vdCB5ZXQgaW1wbGVtZW50ZWQiCisJCSAgICBlbHNlOgorCQkJY2hhciA9IHNvdXJjZS5nZXQoKQorCQkJaWYgY2hhciBpcyBOb25lOgorCQkJICAgIHJhaXNlIGVycm9yLCAidW5leHBlY3RlZCBlbmQgb2YgcGF0dGVybiIKKwkJCXJhaXNlIGVycm9yLCAidW5rbm93biBzcGVjaWZpZXI6ID9QJXMiICUgY2hhcgogCQllbGlmIHNvdXJjZS5tYXRjaCgiOiIpOgogCQkgICAgIyBub24tY2FwdHVyaW5nIGdyb3VwCiAJCSAgICBncm91cCA9IDIKLQkJZWxpZiBzb3VyY2UubWF0Y2hfc2V0KCJpSSIpOgotCQkgICAgcGF0dGVybi5zZXRmbGFnKCJpIikKLQkJZWxpZiBzb3VyY2UubWF0Y2hfc2V0KCJsTCIpOgotCQkgICAgcGF0dGVybi5zZXRmbGFnKCJsIikKLQkJZWxpZiBzb3VyY2UubWF0Y2hfc2V0KCJtTSIpOgotCQkgICAgcGF0dGVybi5zZXRmbGFnKCJtIikKLQkJZWxpZiBzb3VyY2UubWF0Y2hfc2V0KCJzUyIpOgotCQkgICAgcGF0dGVybi5zZXRmbGFnKCJzIikKLQkJZWxpZiBzb3VyY2UubWF0Y2hfc2V0KCJ4WCIpOgotCQkgICAgcGF0dGVybi5zZXRmbGFnKCJ4IikKKwkJZWxpZiBzb3VyY2UubWF0Y2goIiMiKToKKwkJICAgICMgY29tbWVudAorCQkgICAgd2hpbGUgMToKKwkJCWlmIHNvdXJjZS5uZXh0IGlzIE5vbmUgb3Igc291cmNlLm5leHQgPT0gIikiOgorCQkJICAgIGJyZWFrCisJCQlzb3VyY2UuZ2V0KCkKKwkJZWxzZToKKwkJICAgICMgZmxhZ3MKKwkJICAgIHdoaWxlIEZMQUdTLmhhc19rZXkoc291cmNlLm5leHQpOgorCQkJc3RhdGUuZmxhZ3MgPSBzdGF0ZS5mbGFncyB8IEZMQUdTW3NvdXJjZS5nZXQoKV0KIAkgICAgaWYgZ3JvdXA6CiAJCSMgcGFyc2UgZ3JvdXAgY29udGVudHMKIAkJYiA9IFtdCkBAIC00MDgsMzAgKzQ2NywyNSBAQAogCQkgICAgIyBhbm9ueW1vdXMgZ3JvdXAKIAkJICAgIGdyb3VwID0gTm9uZQogCQllbHNlOgotCQkgICAgZ3JvdXAgPSBwYXR0ZXJuLmdldGdyb3VwKG5hbWUpCi0gCQlpZiBncm91cDoKLSAJCSAgICBzdWJwYXR0ZXJuLmFwcGVuZCgoTUFSSywgKGdyb3VwLTEpKjIpKQorCQkgICAgZ3JvdXAgPSBzdGF0ZS5nZXRncm91cChuYW1lKQogCQl3aGlsZSAxOgotCQkgICAgcCA9IF9wYXJzZShzb3VyY2UsIHBhdHRlcm4sIGZsYWdzKQorCQkgICAgcCA9IF9wYXJzZShzb3VyY2UsIHN0YXRlLCBmbGFncykKIAkJICAgIGlmIHNvdXJjZS5tYXRjaCgiKSIpOgogCQkJaWYgYjoKIAkJCSAgICBiLmFwcGVuZChwKQotCQkJICAgIF9icmFuY2goc3VicGF0dGVybiwgYikKLQkJCWVsc2U6Ci0JCQkgICAgc3VicGF0dGVybi5hcHBlbmQoKFNVQlBBVFRFUk4sIChncm91cCwgcCkpKQorCQkJICAgIHAgPSBfYnJhbmNoKHN0YXRlLCBiKQorCQkJc3VicGF0dGVybi5hcHBlbmQoKFNVQlBBVFRFUk4sIChncm91cCwgcCkpKQogCQkJYnJlYWsKIAkJICAgIGVsaWYgc291cmNlLm1hdGNoKCJ8Iik6CiAJCQliLmFwcGVuZChwKQogCQkgICAgZWxzZToKLQkJCXJhaXNlIFN5bnRheEVycm9yLCAiZ3JvdXAgbm90IHByb3Blcmx5IGNsb3NlZCIKLSAJCWlmIGdyb3VwOgotIAkJICAgIHN1YnBhdHRlcm4uYXBwZW5kKChNQVJLLCAoZ3JvdXAtMSkqMisxKSkKKwkJCXJhaXNlIGVycm9yLCAiZ3JvdXAgbm90IHByb3Blcmx5IGNsb3NlZCIKIAkgICAgZWxzZToKLQkJIyBGSVhNRTogc2hvdWxkIHRoaXMgcmVhbGx5IGJlIGEgd2hpbGUgbG9vcD8KIAkJd2hpbGUgMToKIAkJICAgIGNoYXIgPSBzb3VyY2UuZ2V0KCkKIAkJICAgIGlmIGNoYXIgaXMgTm9uZSBvciBjaGFyID09ICIpIjoKIAkJCWJyZWFrCisJCSAgICByYWlzZSBlcnJvciwgInVua25vd24gZXh0ZW5zaW9uIgogCiAJZWxpZiB0aGlzID09ICJeIjoKIAkgICAgc3VicGF0dGVybi5hcHBlbmQoKEFULCBBVF9CRUdJTk5JTkcpKQpAQCAtNDQwLDU4ICs0OTQsOTMgQEAKIAkgICAgc3VicGF0dGVybi5hcHBlbmQoKEFULCBBVF9FTkQpKQogCiAJZWxpZiB0aGlzIGFuZCB0aGlzWzBdID09ICJcXCI6Ci0JICAgIGNvZGUgPV9maXhlc2NhcGUodGhpcykKKwkgICAgY29kZSA9IF9lc2NhcGUoc291cmNlLCB0aGlzLCBzdGF0ZSkKIAkgICAgc3VicGF0dGVybi5hcHBlbmQoY29kZSkKIAogCWVsc2U6Ci0JICAgIHJhaXNlIFN5bnRheEVycm9yLCAicGFyc2VyIGVycm9yIgorCSAgICByYWlzZSBlcnJvciwgInBhcnNlciBlcnJvciIKIAogICAgIHJldHVybiBzdWJwYXR0ZXJuCiAKLWRlZiBwYXJzZShzb3VyY2UsIGZsYWdzPSgpKToKLSAgICBzID0gVG9rZW5pemVyKHNvdXJjZSkKLSAgICBnID0gUGF0dGVybigpCitkZWYgcGFyc2UocGF0dGVybiwgZmxhZ3M9MCk6CisgICAgIyBwYXJzZSAncmUnIHBhdHRlcm4gaW50byBsaXN0IG9mIChvcGNvZGUsIGFyZ3VtZW50KSB0dXBsZXMKKyAgICBzb3VyY2UgPSBUb2tlbml6ZXIocGF0dGVybikKKyAgICBzdGF0ZSA9IFN0YXRlKCkKICAgICBiID0gW10KICAgICB3aGlsZSAxOgotCXAgPSBfcGFyc2UocywgZywgZmxhZ3MpCi0JdGFpbCA9IHMuZ2V0KCkKKwlwID0gX3BhcnNlKHNvdXJjZSwgc3RhdGUsIGZsYWdzKQorCXRhaWwgPSBzb3VyY2UuZ2V0KCkKIAlpZiB0YWlsID09ICJ8IjoKIAkgICAgYi5hcHBlbmQocCkKIAllbGlmIHRhaWwgPT0gIikiOgotCSAgICByYWlzZSBTeW50YXhFcnJvciwgInVuYmFsYW5jZWQgcGFyZW50aGVzaXMiCisJICAgIHJhaXNlIGVycm9yLCAidW5iYWxhbmNlZCBwYXJlbnRoZXNpcyIKIAllbGlmIHRhaWwgaXMgTm9uZToKIAkgICAgaWYgYjoKIAkJYi5hcHBlbmQocCkKLQkJcCA9IFN1YlBhdHRlcm4oZykKLQkJX2JyYW5jaChwLCBiKQorCQlwID0gX2JyYW5jaChzdGF0ZSwgYikKIAkgICAgYnJlYWsKIAllbHNlOgotCSAgICByYWlzZSBTeW50YXhFcnJvciwgImJvZ3VzIGNoYXJhY3RlcnMgYXQgZW5kIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiIKKwkgICAgcmFpc2UgZXJyb3IsICJib2d1cyBjaGFyYWN0ZXJzIGF0IGVuZCBvZiByZWd1bGFyIGV4cHJlc3Npb24iCiAgICAgcmV0dXJuIHAKIAotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgICBmcm9tIHBwcmludCBpbXBvcnQgcHByaW50Ci0gICAgZnJvbSB0ZXN0cGF0dGVybnMgaW1wb3J0IFBBVFRFUk5TCi0gICAgYSA9IGIgPSBjID0gMAotICAgIGZvciBwYXR0ZXJuLCBmbGFncyBpbiBQQVRURVJOUzoKLQlpZiBmbGFnczoKLQkgICAgY29udGludWUKLQlwcmludCAiLSIqNjgKLQl0cnk6Ci0JICAgIHAgPSBwYXJzZShwYXR0ZXJuKQotCSAgICBwcmludCByZXByKHBhdHRlcm4pLCAiLT4iCi0JICAgIHBwcmludChwLmRhdGEpCi0JICAgIGltcG9ydCBzcmVfY29tcGlsZQotCSAgICB0cnk6Ci0JCWNvZGUgPSBzcmVfY29tcGlsZS5jb21waWxlKHApCi0JCWMgPSBjICsgMQotCSAgICBleGNlcHQ6Ci0JCXBhc3MKLQkgICAgYSA9IGEgKyAxCi0JZXhjZXB0IFN5bnRheEVycm9yLCB2OgotCSAgICBwcmludCAiKioiLCByZXByKHBhdHRlcm4pLCB2Ci0JYiA9IGIgKyAxCi0gICAgcHJpbnQgIi0iKjY4Ci0gICAgcHJpbnQgYSwgIm9mIiwgYiwgInBhdHRlcm5zIHN1Y2Nlc3NmdWxseSBwYXJzZWQiCi0gICAgcHJpbnQgYywgIm9mIiwgYiwgInBhdHRlcm5zIHN1Y2Nlc3NmdWxseSBjb21waWxlZCIKK2RlZiBwYXJzZV90ZW1wbGF0ZShzb3VyY2UsIHBhdHRlcm4pOgorICAgICMgcGFyc2UgJ3JlJyByZXBsYWNlbWVudCBzdHJpbmcgaW50byBsaXN0IG9mIGxpdGVyYWxzIGFuZAorICAgICMgZ3JvdXAgcmVmZXJlbmNlcworICAgIHMgPSBUb2tlbml6ZXIoc291cmNlKQorICAgIHAgPSBbXQorICAgIGEgPSBwLmFwcGVuZAorICAgIHdoaWxlIDE6CisJdGhpcyA9IHMuZ2V0KCkKKwlpZiB0aGlzIGlzIE5vbmU6CisJICAgIGJyZWFrICMgZW5kIG9mIHJlcGxhY2VtZW50IHN0cmluZworCWlmIHRoaXMgYW5kIHRoaXNbMF0gPT0gIlxcIjoKKwkgICAgaWYgdGhpcyA9PSAiXFxnIjoKKwkJbmFtZSA9ICIiCisJCWlmIHMubWF0Y2goIjwiKToKKwkJICAgIHdoaWxlIDE6CisJCQljaGFyID0gcy5nZXQoKQorCQkJaWYgY2hhciBpcyBOb25lOgorCQkJICAgIHJhaXNlIGVycm9yLCAidW50ZXJtaW5hdGVkIGdyb3VwIG5hbWUiCisJCQlpZiBjaGFyID09ICI+IjoKKwkJCSAgICBicmVhaworCQkJbmFtZSA9IG5hbWUgKyBjaGFyCisJCWlmIG5vdCBuYW1lOgorCQkgICAgcmFpc2UgZXJyb3IsICJiYWQgZ3JvdXAgbmFtZSIKKwkJdHJ5OgorCQkgICAgaW5kZXggPSBpbnQobmFtZSkKKwkJZXhjZXB0IFZhbHVlRXJyb3I6CisJCSAgICBpZiBub3QgaXNuYW1lKG5hbWUpOgorCQkJcmFpc2UgZXJyb3IsICJpbGxlZ2FsIGNoYXJhY3RlciBpbiBncm91cCBuYW1lIgorCQkgICAgdHJ5OgorCQkJaW5kZXggPSBwYXR0ZXJuLmdyb3VwaW5kZXhbbmFtZV0KKwkJICAgIGV4Y2VwdCBLZXlFcnJvcjoKKwkJCXJhaXNlIEluZGV4RXJyb3IsICJ1bmtub3duIGdyb3VwIG5hbWUiCisJCWEoKE1BUkssIGluZGV4KSkKKwkgICAgZWxpZiBsZW4odGhpcykgPiAxIGFuZCB0aGlzWzFdIGluIERJR0lUUzoKKwkJd2hpbGUgcy5uZXh0IGluIERJR0lUUzoKKwkJICAgIHRoaXMgPSB0aGlzICsgcy5nZXQoKQorCQlhKChNQVJLLCBpbnQodGhpc1sxOl0pKSkKKwkgICAgZWxzZToKKwkJdHJ5OgorCQkgICAgYShFU0NBUEVTW3RoaXNdKQorCQlleGNlcHQgS2V5RXJyb3I6CisJCSAgICBmb3IgY2hhciBpbiB0aGlzOgorCQkJYSgoTElURVJBTCwgY2hhcikpCisJZWxzZToKKwkgICAgYSgoTElURVJBTCwgdGhpcykpCisgICAgcmV0dXJuIHAKIAorZGVmIGV4cGFuZF90ZW1wbGF0ZSh0ZW1wbGF0ZSwgbWF0Y2gpOgorICAgICMgRklYTUU6IDxmbD4gdGhpcyBpcyBzb29vb28gc2xvdy4gIGRyb3AgaW4gdGhlIHNsaWNlbGlzdAorICAgICMgY29kZSBpbnN0ZWFkCisgICAgcCA9IFtdCisgICAgYSA9IHAuYXBwZW5kCisgICAgZm9yIGMsIHMgaW4gdGVtcGxhdGU6CisJaWYgYyBpcyBMSVRFUkFMOgorCSAgICBhKHMpCisJZWxpZiBjIGlzIE1BUks6CisJICAgIHMgPSBtYXRjaC5ncm91cChzKQorCSAgICBpZiBzIGlzIE5vbmU6CisJCXJhaXNlIGVycm9yLCAiZW1wdHkgZ3JvdXAiCisJICAgIGEocykKKyAgICByZXR1cm4gbWF0Y2guc3RyaW5nWzowXS5qb2luKHApCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X2Fyci5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfYXJyLnB5CmluZGV4IDFlMGYxYmUuLmE4MmFjZTUgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfYXJyLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfYXJyLnB5CkBAIC0xNSw2ICsxNSw0NCBAQAogICAgIHVubGluayhURVNURk4pCiAKIAorZGVmIHRlc3RvdmVyZmxvdyh0eXBlLCBsb3dlckxpbWl0LCB1cHBlckxpbWl0KToKKwkjIHNob3VsZCBub3Qgb3ZlcmZsb3cgYXNzaWduaW5nIGxvd2VyIGxpbWl0CisJaWYgdmVyYm9zZToKKwkJcHJpbnQgIm92ZXJmbG93IHRlc3Q6IGFycmF5KCVzLCBbJXNdKSIgJSAoYHR5cGVgLCBgbG93ZXJMaW1pdGApCisJdHJ5OgorCQlhID0gYXJyYXkuYXJyYXkodHlwZSwgW2xvd2VyTGltaXRdKQorCWV4Y2VwdDoKKwkJcmFpc2UgVGVzdEZhaWxlZCwgImFycmF5KCVzKSBvdmVyZmxvd2VkIGFzc2lnbmluZyAlcyIgJVwKKwkJCShgdHlwZWAsIGBsb3dlckxpbWl0YCkKKwkjIHNob3VsZCBvdmVyZmxvdyBhc3NpZ25pbmcgbGVzcyB0aGFuIGxvd2VyIGxpbWl0CisJaWYgdmVyYm9zZToKKwkJcHJpbnQgIm92ZXJmbG93IHRlc3Q6IGFycmF5KCVzLCBbJXNdKSIgJSAoYHR5cGVgLCBgbG93ZXJMaW1pdC0xYCkKKwl0cnk6CisJCWEgPSBhcnJheS5hcnJheSh0eXBlLCBbbG93ZXJMaW1pdC0xXSkKKwkJcmFpc2UgVGVzdEZhaWxlZCwgImFycmF5KCVzKSBkaWQgbm90IG92ZXJmbG93IGFzc2lnbmluZyAlcyIgJVwKKwkJCShgdHlwZWAsIGBsb3dlckxpbWl0LTFgKQorCWV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorCQlwYXNzCisJIyBzaG91bGQgbm90IG92ZXJmbG93IGFzc2lnbmluZyB1cHBlciBsaW1pdAorCWlmIHZlcmJvc2U6CisJCXByaW50ICJvdmVyZmxvdyB0ZXN0OiBhcnJheSglcywgWyVzXSkiICUgKGB0eXBlYCwgYHVwcGVyTGltaXRgKQorCXRyeToKKwkJYSA9IGFycmF5LmFycmF5KHR5cGUsIFt1cHBlckxpbWl0XSkKKwlleGNlcHQ6CisJCXJhaXNlIFRlc3RGYWlsZWQsICJhcnJheSglcykgb3ZlcmZsb3dlZCBhc3NpZ25pbmcgJXMiICVcCisJCQkoYHR5cGVgLCBgdXBwZXJMaW1pdGApCisJIyBzaG91bGQgb3ZlcmZsb3cgYXNzaWduaW5nIG1vcmUgdGhhbiB1cHBlciBsaW1pdAorCWlmIHZlcmJvc2U6CisJCXByaW50ICJvdmVyZmxvdyB0ZXN0OiBhcnJheSglcywgWyVzXSkiICUgKGB0eXBlYCwgYHVwcGVyTGltaXQrMWApCisJdHJ5OgorCQlhID0gYXJyYXkuYXJyYXkodHlwZSwgW3VwcGVyTGltaXQrMV0pCisJCXJhaXNlIFRlc3RGYWlsZWQsICJhcnJheSglcykgZGlkIG5vdCBvdmVyZmxvdyBhc3NpZ25pbmcgJXMiICVcCisJCQkoYHR5cGVgLCBgdXBwZXJMaW1pdCsxYCkKKwlleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKwkJcGFzcworCisKKwogZGVmIHRlc3R0eXBlKHR5cGUsIGV4YW1wbGUpOgogCiAgICAgICAgIGEgPSBhcnJheS5hcnJheSh0eXBlKQpAQCAtODEsNiArMTE5LDIwIEBACiAgICAgICAgICAgICBpZiBhICE9IGFycmF5LmFycmF5KHR5cGUsIFsxLCAxLCAyLCAzLCA0LCA1LCA1XSk6CiAgICAgICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgImFycmF5KCVzKSBzZWxmLXNsaWNlLWFzc2lnbiAoY250cikiICUgYHR5cGVgCiAKLQorICAgICAgICAjIHRlc3QgdGhhdCBvdmVyZmxvdyBleGNlcHRpb25zIGFyZSByYWlzZWQgYXMgZXhwZWN0ZWQgZm9yIGFzc2lnbm1lbnQKKyAgICAgICAgIyB0byBhcnJheSBvZiBzcGVjaWZpYyBpbnRlZ3JhbCB0eXBlcworICAgICAgICBmcm9tIG1hdGggaW1wb3J0IHBvdworICAgICAgICBpZiB0eXBlIGluICgnYicsICdoJywgJ2knLCAnbCcpOgorICAgICAgICAgICAgIyBjaGVjayBzaWduZWQgYW5kIHVuc2lnbmVkIHZlcnNpb25zCisgICAgICAgICAgICBhID0gYXJyYXkuYXJyYXkodHlwZSkKKyAgICAgICAgICAgIHNpZ25lZExvd2VyTGltaXQgPSAtMSAqIGxvbmcocG93KDIsIGEuaXRlbXNpemUgKiA4IC0gMSkpCisgICAgICAgICAgICBzaWduZWRVcHBlckxpbWl0ID0gbG9uZyhwb3coMiwgYS5pdGVtc2l6ZSAqIDggLSAxKSkgLSAxTAorICAgICAgICAgICAgdW5zaWduZWRMb3dlckxpbWl0ID0gMAorICAgICAgICAgICAgdW5zaWduZWRVcHBlckxpbWl0ID0gbG9uZyhwb3coMiwgYS5pdGVtc2l6ZSAqIDgpKSAtIDFMCisgICAgICAgICAgICB0ZXN0b3ZlcmZsb3codHlwZSwgc2lnbmVkTG93ZXJMaW1pdCwgc2lnbmVkVXBwZXJMaW1pdCkKKyAgICAgICAgICAgIHRlc3RvdmVyZmxvdyh0eXBlLnVwcGVyKCksIHVuc2lnbmVkTG93ZXJMaW1pdCwgdW5zaWduZWRVcHBlckxpbWl0KQorCQkJCisJCQkKKwkJCiBtYWluKCkKLSAgICAgICAgCisKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3RfYXRlLnB5IGIvTGliL2Rvcy04eDMvdGVzdF9hdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3NjEwYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfYXRlLnB5CkBAIC0wLDAgKzEsMjQgQEAKKyMgVGVzdCB0aGUgZXhpdCBtb2R1bGUKK2Zyb20gdGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlCitpbXBvcnQgYXRleGl0CisKK2RlZiBoYW5kbGVyMSgpOgorICAgIHByaW50ICJoYW5kbGVyMSIKKworZGVmIGhhbmRsZXIyKCphcmdzLCAqKmthcmdzKToKKyAgICBwcmludCAiaGFuZGxlcjIiLCBhcmdzLCBrYXJncworCisjIHNhdmUgYW55IGV4aXQgZnVuY3Rpb25zIHRoYXQgbWF5IGhhdmUgYmVlbiByZWdpc3RlcmVkIGFzIHBhcnQgb2YgdGhlCisjIHRlc3QgZnJhbWV3b3JrCitfZXhpdGhhbmRsZXJzID0gYXRleGl0Ll9leGl0aGFuZGxlcnMKK2F0ZXhpdC5fZXhpdGhhbmRsZXJzID0gW10KKworYXRleGl0LnJlZ2lzdGVyKGhhbmRsZXIxKQorYXRleGl0LnJlZ2lzdGVyKGhhbmRsZXIyKQorYXRleGl0LnJlZ2lzdGVyKGhhbmRsZXIyLCA3LCBrdz0iYWJjIikKKworIyBzaW11bGF0ZSBleGl0IGJlaGF2aW9yIGJ5IGNhbGxpbmcgYXRleGl0Ll9ydW5fZXhpdGZ1bmNzIGRpcmVjdGx5Li4uCithdGV4aXQuX3J1bl9leGl0ZnVuY3MoKQorCisjIHJlc3RvcmUgZXhpdCBoYW5kbGVycworYXRleGl0Ll9leGl0aGFuZGxlcnMgPSBfZXhpdGhhbmRsZXJzCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X2Jpbi5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfYmluLnB5CmluZGV4IDI4OTA4ZWYuLjUzNGZhNzMgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfYmluLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfYmluLnB5CkBAIC0xLDkzICsxLDQ2IEBACi0iIiJUZXN0IHRoZSBiaW5hc2NpaSBDIG1vZHVsZS4iIiIKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiIlRlc3Qgc2NyaXB0IGZvciB0aGUgYmluaGV4IEMgbW9kdWxlCiAKKyAgIFVzZXMgdGhlIG1lY2hhbmlzbSBvZiB0aGUgcHl0aG9uIGJpbmhleCBtb2R1bGUKKyAgIFJvZ2VyIEUuIE1hc3NlCisiIiIKK2ltcG9ydCBiaW5oZXgKK2ltcG9ydCB0ZW1wZmlsZQogZnJvbSB0ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UKLWltcG9ydCBiaW5hc2NpaQogCi0jIFNob3cgbW9kdWxlIGRvYyBzdHJpbmcKLXByaW50IGJpbmFzY2lpLl9fZG9jX18KK2RlZiB0ZXN0KCk6CiAKLSMgU2hvdyBtb2R1bGUgZXhjZXB0aW9ucwotcHJpbnQgYmluYXNjaWkuRXJyb3IKLXByaW50IGJpbmFzY2lpLkluY29tcGxldGUKKyAgICB0cnk6CisgICAgICAgIGZuYW1lMSA9IHRlbXBmaWxlLm1rdGVtcCgpCisgICAgICAgIGZuYW1lMiA9IHRlbXBmaWxlLm1rdGVtcCgpCisgICAgICAgIGYgPSBvcGVuKGZuYW1lMSwgJ3cnKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJDYW5ub3QgdGVzdCBiaW5oZXggd2l0aG91dCBhIHRlbXAgZmlsZSIKIAotIyBDaGVjayBwcmVzZW5jZSBhbmQgZGlzcGxheSBkb2Mgc3RyaW5ncyBvZiBhbGwgZnVuY3Rpb25zCi1mdW5jcyA9IFtdCi1mb3Igc3VmZml4IGluICJiYXNlNjQiLCAiaHF4IiwgInV1IjoKLSAgICBwcmVmaXhlcyA9IFsiYTJiXyIsICJiMmFfIl0KLSAgICBpZiBzdWZmaXggPT0gImhxeCI6Ci0gICAgICAgIHByZWZpeGVzLmV4dGVuZChbImNyY18iLCAicmxlY29kZV8iLCAicmxlZGVjb2RlXyJdKQotICAgIGZvciBwcmVmaXggaW4gcHJlZml4ZXM6Ci0gICAgICAgIG5hbWUgPSBwcmVmaXggKyBzdWZmaXgKLSAgICAgICAgZnVuY3MuYXBwZW5kKGdldGF0dHIoYmluYXNjaWksIG5hbWUpKQotZm9yIGZ1bmMgaW4gZnVuY3M6Ci0gICAgcHJpbnQgIiUtMTVzOiAlcyIgJSAoZnVuYy5fX25hbWVfXywgZnVuYy5fX2RvY19fKQorICAgIHN0YXJ0ID0gJ0phY2sgaXMgbXkgaGVybycKKyAgICBmLndyaXRlKHN0YXJ0KQorICAgIGYuY2xvc2UoKQorICAgIAorICAgIGJpbmhleC5iaW5oZXgoZm5hbWUxLCBmbmFtZTIpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2JpbmhleCcKIAotIyBDcmVhdGUgYmluYXJ5IHRlc3QgZGF0YQotdGVzdGRhdGEgPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy5cclxuIgotZm9yIGkgaW4gcmFuZ2UoMjU2KToKLSAgICAjIEJlIHNsb3cgc28gd2UgZG9uJ3QgZGVwZW5kIG9uIG90aGVyIG1vZHVsZXMKLSAgICB0ZXN0ZGF0YSA9IHRlc3RkYXRhICsgY2hyKGkpCi10ZXN0ZGF0YSA9IHRlc3RkYXRhICsgIlxyXG5IZWxsbyB3b3JsZC5cbiIKKyAgICBiaW5oZXguaGV4YmluKGZuYW1lMiwgZm5hbWUxKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdoZXhiaW4nCiAKLSMgVGVzdCBiYXNlNjQgd2l0aCB2YWxpZCBkYXRhCi1wcmludCAiYmFzZTY0IHRlc3QiCi1NQVhfQkFTRTY0ID0gNTcKLWxpbmVzID0gW10KLWZvciBpIGluIHJhbmdlKDAsIGxlbih0ZXN0ZGF0YSksIE1BWF9CQVNFNjQpOgotICAgIGIgPSB0ZXN0ZGF0YVtpOmkrTUFYX0JBU0U2NF0KLSAgICBhID0gYmluYXNjaWkuYjJhX2Jhc2U2NChiKQotICAgIGxpbmVzLmFwcGVuZChhKQotICAgIHByaW50IGEsCi1yZXMgPSAiIgotZm9yIGxpbmUgaW4gbGluZXM6Ci0gICAgYiA9IGJpbmFzY2lpLmEyYl9iYXNlNjQobGluZSkKLSAgICByZXMgPSByZXMgKyBiCi1hc3NlcnQgcmVzID09IHRlc3RkYXRhCisgICAgZiA9IG9wZW4oZm5hbWUxLCAncicpCisgICAgZmluaXNoID0gZi5yZWFkbGluZSgpCiAKLSMgVGVzdCBiYXNlNjQgd2l0aCByYW5kb20gaW52YWxpZCBjaGFyYWN0ZXJzIHNwcmlua2xlZCB0aHJvdWdob3V0Ci0jIChUaGlzIHJlcXVpcmVzIGEgbmV3IHZlcnNpb24gb2YgYmluYXNjaWkuKQotZmlsbGVycyA9ICIiCi12YWxpZCA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSsvIgotZm9yIGkgaW4gcmFuZ2UoMjU2KToKLSAgICBjID0gY2hyKGkpCi0gICAgaWYgYyBub3QgaW4gdmFsaWQ6Ci0gICAgICAgIGZpbGxlcnMgPSBmaWxsZXJzICsgYwotZGVmIGFkZG5vaXNlKGxpbmUpOgotICAgIG5vaXNlID0gZmlsbGVycwotICAgIHJhdGlvID0gbGVuKGxpbmUpIC8gbGVuKG5vaXNlKQotICAgIHJlcyA9ICIiCi0gICAgd2hpbGUgbGluZSBhbmQgbm9pc2U6Ci0gICAgICAgIGlmIGxlbihsaW5lKSAvIGxlbihub2lzZSkgPiByYXRpbzoKLSAgICAgICAgICAgIGMsIGxpbmUgPSBsaW5lWzBdLCBsaW5lWzE6XQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYywgbm9pc2UgPSBub2lzZVswXSwgbm9pc2VbMTpdCi0gICAgICAgIHJlcyA9IHJlcyArIGMKLSAgICByZXR1cm4gcmVzICsgbm9pc2UgKyBsaW5lCi1yZXMgPSAiIgotZm9yIGxpbmUgaW4gbWFwKGFkZG5vaXNlLCBsaW5lcyk6Ci0gICAgYiA9IGJpbmFzY2lpLmEyYl9iYXNlNjQobGluZSkKLSAgICByZXMgPSByZXMgKyBiCi1hc3NlcnQgcmVzID09IHRlc3RkYXRhCisgICAgaWYgc3RhcnQgPD4gZmluaXNoOgorICAgICAgICBwcmludCAnRXJyb3I6IGJpbmhleCA8PiBoZXhiaW4nCisgICAgZWxpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnYmluaGV4ID09IGhleGJpbicKIAotIyBUZXN0IHV1Ci1wcmludCAidXUgdGVzdCIKLU1BWF9VVSA9IDQ1Ci1saW5lcyA9IFtdCi1mb3IgaSBpbiByYW5nZSgwLCBsZW4odGVzdGRhdGEpLCBNQVhfVVUpOgotICAgIGIgPSB0ZXN0ZGF0YVtpOmkrTUFYX1VVXQotICAgIGEgPSBiaW5hc2NpaS5iMmFfdXUoYikKLSAgICBsaW5lcy5hcHBlbmQoYSkKLSAgICBwcmludCBhLAotcmVzID0gIiIKLWZvciBsaW5lIGluIGxpbmVzOgotICAgIGIgPSBiaW5hc2NpaS5hMmJfdXUobGluZSkKLSAgICByZXMgPSByZXMgKyBiCi1hc3NlcnQgcmVzID09IHRlc3RkYXRhCi0KLSMgVGVzdCBjcmMzMigpCi1jcmMgPSBiaW5hc2NpaS5jcmMzMigiVGVzdCB0aGUgQ1JDLTMyIG9mIikKLWNyYyA9IGJpbmFzY2lpLmNyYzMyKCIgdGhpcyBzdHJpbmcuIiwgY3JjKQotaWYgY3JjICE9IDE1NzEyMjAzMzA6Ci0gICAgcHJpbnQgImJpbmFzY2lpLmNyYzMyKCkgZmFpbGVkLiIKLQotIyBUaGUgaHF4IHRlc3QgaXMgaW4gdGVzdF9iaW5oZXgucHkKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICBvcy51bmxpbmsoZm5hbWUxKQorICAgICAgICBvcy51bmxpbmsoZm5hbWUyKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcwordGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X2V4Yy5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfZXhjLnB5CmluZGV4IDk3OTZlZjQuLjdiYzUxNWMgMTAwNzU1Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfZXhjLnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfZXhjLnB5CkBAIC02LDcgKzYsMTkgQEAKIHByaW50ICc1LiBCdWlsdC1pbiBleGNlcHRpb25zJwogIyBYWFggVGhpcyBpcyBub3QgcmVhbGx5IGVub3VnaCwgZWFjaCAqb3BlcmF0aW9uKiBzaG91bGQgYmUgdGVzdGVkIQogCitkZWYgdGVzdF9yYWlzZV9jYXRjaChleGMpOgorICAgIHRyeToKKyAgICAgICAgcmFpc2UgZXhjLCAic3BhbSIKKyAgICBleGNlcHQgZXhjLCBlcnI6CisgICAgICAgIGJ1ZiA9IHN0cihlcnIpCisgICAgdHJ5OgorICAgICAgICByYWlzZSBleGMoInNwYW0iKQorICAgIGV4Y2VwdCBleGMsIGVycjoKKyAgICAgICAgYnVmID0gc3RyKGVycikKKyAgICBwcmludCBidWYKKwogZGVmIHIodGhpbmcpOgorICAgIHRlc3RfcmFpc2VfY2F0Y2godGhpbmcpCiAgICAgaWYgdHlwZSh0aGluZykgPT0gQ2xhc3NUeXBlOgogICAgICAgICBwcmludCB0aGluZy5fX25hbWVfXwogICAgIGVsc2U6CkBAIC05NCw0ICsxMDYsOCBAQAogdHJ5OiB4ID0gMS8wCiBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKIAorcihFeGNlcHRpb24pCit0cnk6IHggPSAxLzAKK2V4Y2VwdCBFeGNlcHRpb24sIGU6IHBhc3MKKwogdW5saW5rKFRFU1RGTikKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3RfbGluLnB5IGIvTGliL2Rvcy04eDMvdGVzdF9saW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2MTJhNwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfbGluLnB5CkBAIC0wLDAgKzEsMjAgQEAKK2Zyb20gdGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBmaW5kZmlsZSwgVGVzdEZhaWxlZAoraW1wb3J0IGxpbnV4YXVkaW9kZXYKK2ltcG9ydCBvcworCitkZWYgcGxheV9zb3VuZF9maWxlKHBhdGgpOgorICAgIGZwID0gb3BlbihwYXRoLCAncicpCisgICAgZGF0YSA9IGZwLnJlYWQoKQorICAgIGZwLmNsb3NlKCkKKyAgICB0cnk6CisgICAgICAgIGEgPSBsaW51eGF1ZGlvZGV2Lm9wZW4oJ3cnKQorICAgIGV4Y2VwdCBsaW51eGF1ZGlvZGV2LmVycm9yLCBtc2c6CisgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsIG1zZworICAgIGVsc2U6CisgICAgICAgIGEud3JpdGUoZGF0YSkKKyAgICAgICAgYS5jbG9zZSgpCisKK2RlZiB0ZXN0KCk6CisgICAgcGxheV9zb3VuZF9maWxlKGZpbmRmaWxlKCdhdWRpb3Rlc3QuYXUnKSkKKwordGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvZG9zLTh4My90ZXN0X21hdC5weSBiL0xpYi9kb3MtOHgzL3Rlc3RfbWF0LnB5CmluZGV4IDZkNmJjNDQuLjVjOGVmYzYgMTAwNjQ0Ci0tLSBhL0xpYi9kb3MtOHgzL3Rlc3RfbWF0LnB5CisrKyBiL0xpYi9kb3MtOHgzL3Rlc3RfbWF0LnB5CkBAIC0xMjksNiArMTI5LDE4IEBACiB0ZXN0aXQoJ3BvdygyLDEpJywgbWF0aC5wb3coMiwxKSwgMikKIHRlc3RpdCgncG93KDIsLTEpJywgbWF0aC5wb3coMiwtMSksIDAuNSkKIAorcHJpbnQgJ3JpbnQnCit0cnk6CisJbWF0aC5yaW50CitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisJIyB0aGlzIHBsYXRmb3JtIGRvZXMgbm90IGhhdmUgcmludCwgdGhhdCBpcyBmaW5lLCBza2lwIHRoZSB0ZXN0CisJcGFzcworZWxzZToKKwl0ZXN0aXQoJ3JpbnQoMC43KScsIG1hdGgucmludCgwLjcpLCAxKQorCXRlc3RpdCgncmludCgtMC4zKScsIG1hdGgucmludCgtMC4zKSwgMCkKKwl0ZXN0aXQoJ3JpbnQoMi41KScsIG1hdGgucmludCgyLjUpLCAyKQorCXRlc3RpdCgncmludCgzLjUpJywgbWF0aC5yaW50KDMuNSksIDQpIAorCiBwcmludCAnc2luJwogdGVzdGl0KCdzaW4oMCknLCBtYXRoLnNpbigwKSwgMCkKIHRlc3RpdCgnc2luKHBpLzIpJywgbWF0aC5zaW4obWF0aC5waS8yKSwgMSkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3RfbW1hLnB5IGIvTGliL2Rvcy04eDMvdGVzdF9tbWEucHkKaW5kZXggZTVkYTE4Ny4uYzNjYWZjYSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF9tbWEucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9tbWEucHkKQEAgLTU4LDcgKzU4LDQyIEBACiAgICAgICAgIAogICAgICAgICBhc3NlcnQgc3RhcnQgPT0gUEFHRVNJWkUKICAgICAgICAgYXNzZXJ0IGVuZCA9PSBQQUdFU0laRSArIDYKLSAgICAgICAgCisKKyAgICAjIHRlc3Qgc2Vla2luZyBhcm91bmQgKHRyeSB0byBvdmVyZmxvdyB0aGUgc2VlayBpbXBsZW1lbnRhdGlvbikKKyAgICBtLnNlZWsoMCwwKQorICAgIHByaW50ICcgIFNlZWsgdG8gemVyb3RoIGJ5dGUnCisgICAgYXNzZXJ0IG0udGVsbCgpID09IDAKKyAgICBtLnNlZWsoNDIsMSkKKyAgICBwcmludCAnICBTZWVrIHRvIDQybmQgYnl0ZScKKyAgICBhc3NlcnQgbS50ZWxsKCkgPT0gNDIKKyAgICBtLnNlZWsoMCwyKQorICAgIHByaW50ICcgIFNlZWsgdG8gbGFzdCBieXRlJworICAgIGFzc2VydCBtLnRlbGwoKSA9PSBsZW4obSkKKwkKKyAgICBwcmludCAnICBUcnkgdG8gc2VlayB0byBuZWdhdGl2ZSBwb3NpdGlvbi4uLicKKyAgICB0cnk6CisgICAgICAgIG0uc2VlaygtMSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGFzc2VydCAwLCAnZXhwZWN0ZWQgYSBWYWx1ZUVycm9yIGJ1dCBkaWQgbm90IGdldCBpdCcKKworICAgIHByaW50ICcgIFRyeSB0byBzZWVrIGJleW9uZCBlbmQgb2YgbW1hcC4uLicKKyAgICB0cnk6CisgICAgICAgIG0uc2VlaygxLDIpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBhc3NlcnQgMCwgJ2V4cGVjdGVkIGEgVmFsdWVFcnJvciBidXQgZGlkIG5vdCBnZXQgaXQnCisKKyAgICBwcmludCAnICBUcnkgdG8gc2VlayB0byBuZWdhdGl2ZSBwb3NpdGlvbi4uLicKKyAgICB0cnk6CisgICAgICAgIG0uc2VlaygtbGVuKG0pLTEsMikKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGFzc2VydCAwLCAnZXhwZWN0ZWQgYSBWYWx1ZUVycm9yIGJ1dCBkaWQgbm90IGdldCBpdCcKKwogICAgIG0uY2xvc2UoKQogICAgIG9zLnVubGluaygiZm9vIikKICAgICBwcmludCAnIFRlc3QgcGFzc2VkJwpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF9vcGUucHkgYi9MaWIvZG9zLTh4My90ZXN0X29wZS5weQppbmRleCAxYTc1MDY1Li44ZDM4NjRjIDEwMDc1NQotLS0gYS9MaWIvZG9zLTh4My90ZXN0X29wZS5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X29wZS5weQpAQCAtMSw1ICsxLDc3IEBACi0jIFB5dGhvbiB0ZXN0IHNldCAtLSBwYXJ0IDMsIGJ1aWx0LWluIG9wZXJhdGlvbnMuCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBzeXMKKworZGVmIHRlc3QobmFtZSwgaW5wdXQsIG91dHB1dCwgKmFyZ3MpOgorICAgIHByaW50ICd0ZXN0aW5nOicsIG5hbWUKKyAgICBmID0gZ2V0YXR0cihvcGVyYXRvciwgbmFtZSkKKyAgICBwYXJhbXMgPSAoaW5wdXQsKSArIGFyZ3MKKyAgICB0cnk6CisgICAgICAgIHZhbCA9IGFwcGx5KGYsIHBhcmFtcykKKyAgICBleGNlcHQ6CisgICAgICAgIHZhbCA9IHN5cy5leGNfdHlwZQorICAgIGlmIHZhbCA8PiBvdXRwdXQ6CisgICAgICAgIHByaW50ICclcyVzID0gJXM6ICVzIGV4cGVjdGVkJyAlIChmLl9fbmFtZV9fLCBwYXJhbXMsIGB2YWxgLCBgb3V0cHV0YCkKKwordGVzdCgnYWJzJywgLTEsIDEpCit0ZXN0KCdhZGQnLCAzLCA3LCA0KQordGVzdCgnYW5kXycsIDB4ZiwgMHhhLCAweGEpCit0ZXN0KCdjb25jYXQnLCAncHknLCAncHl0aG9uJywgJ3Rob24nKQorCit0ZXN0KCdjb3VudE9mJywgWzEsIDIsIDEsIDMsIDEsIDRdLCAxLCAzKQorCithID0gWzQsIDMsIDIsIDFdCit0ZXN0KCdkZWxpdGVtJywgYSwgTm9uZSwgMSkKK2lmIGEgPD4gWzQsIDIsIDFdOgorICAgIHByaW50ICdkZWxpdGVtKCkgZmFpbGVkJworCithID0gcmFuZ2UoMTApCit0ZXN0KCdkZWxzbGljZScsIGEsIE5vbmUsIDIsIDgpCitpZiBhIDw+IFswLCAxLCA4LCA5XToKKyAgICBwcmludCAnZGVsc2xpY2UoKSBmYWlsZWQnCisKK2EgPSByYW5nZSgxMCkKK3Rlc3QoJ2RpdicsIDUsIDIsIDIpCit0ZXN0KCdnZXRpdGVtJywgYSwgMiwgMikKK3Rlc3QoJ2dldHNsaWNlJywgYSwgWzQsIDVdLCA0LCA2KQordGVzdCgnaW5kZXhPZicsIFs0LCAzLCAyLCAxXSwgMSwgMykKK3Rlc3QoJ2ludicsIDQsIC01KQordGVzdCgnaXNDYWxsYWJsZScsIDQsIDApCit0ZXN0KCdpc0NhbGxhYmxlJywgb3BlcmF0b3IuaXNDYWxsYWJsZSwgMSkKK3Rlc3QoJ2lzTWFwcGluZ1R5cGUnLCBvcGVyYXRvci5pc01hcHBpbmdUeXBlLCAwKQordGVzdCgnaXNNYXBwaW5nVHlwZScsIG9wZXJhdG9yLl9fZGljdF9fLCAxKQordGVzdCgnaXNOdW1iZXJUeXBlJywgOC4zLCAxKQordGVzdCgnaXNOdW1iZXJUeXBlJywgZGlyKCksIDApCit0ZXN0KCdpc1NlcXVlbmNlVHlwZScsIGRpcigpLCAxKQordGVzdCgnaXNTZXF1ZW5jZVR5cGUnLCAneWVhaGJ1ZGR5JywgMSkKK3Rlc3QoJ2lzU2VxdWVuY2VUeXBlJywgMywgMCkKK3Rlc3QoJ2xzaGlmdCcsIDUsIDEwLCAxKQordGVzdCgnbW9kJywgNSwgMSwgMikKK3Rlc3QoJ211bCcsIDUsIDEwLCAyKQordGVzdCgnbmVnJywgNSwgLTUpCit0ZXN0KCdvcl8nLCAweGEsIDB4ZiwgMHg1KQordGVzdCgncG9zJywgLTUsIC01KQorCithID0gcmFuZ2UoMykKK3Rlc3QoJ3JlcGVhdCcsIGEsIGErYSwgMikKK3Rlc3QoJ3JzaGlmdCcsIDUsIDIsIDEpCisKK3Rlc3QoJ3NlcXVlbmNlSW5jbHVkZXMnLCByYW5nZSg0KSwgMSwgMikKK3Rlc3QoJ3NlcXVlbmNlSW5jbHVkZXMnLCByYW5nZSg0KSwgMCwgNSkKKwordGVzdCgnc2V0aXRlbScsIGEsIE5vbmUsIDAsIDIpCitpZiBhIDw+IFsyLCAxLCAyXToKKyAgICBwcmludCAnc2V0aXRlbSgpIGZhaWxlZCcKKworYSA9IHJhbmdlKDQpCit0ZXN0KCdzZXRzbGljZScsIGEsIE5vbmUsIDEsIDMsIFsyLCAxXSkKK2lmIGEgPD4gWzAsIDIsIDEsIDNdOgorICAgIHByaW50ICdzZXRzbGljZSgpIGZhaWxlZDonLCBhCisKK3Rlc3QoJ3N1YicsIDUsIDIsIDMpCit0ZXN0KCd0cnV0aCcsIDUsIDEpCit0ZXN0KCd0cnV0aCcsIFtdLCAwKQordGVzdCgneG9yJywgMHhiLCAweDcsIDB4YykKIAogCi1wcmludCAnMy4gT3BlcmF0aW9ucycKLXByaW50ICdYWFggTm90IHlldCBpbXBsZW1lbnRlZCcKKyMgc29tZSBuZWdhdGl2ZSB0ZXN0cwordGVzdCgnaW5kZXhPZicsIFs0LCAzLCAyLCAxXSwgVmFsdWVFcnJvciwgOSkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3RfcHllLnB5IGIvTGliL2Rvcy04eDMvdGVzdF9weWUucHkKaW5kZXggOWY2ZDhkMC4uZDZiZDg0YiAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF9weWUucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9weWUucHkKQEAgLTEwLDEwICsxMCwxMCBAQAogICAgICAgICAgICAgICAgIAogY2xhc3MgT3V0cHV0dGVyOgogICAgIGRlZiBTdGFydEVsZW1lbnRIYW5kbGVyKHNlbGYsIG5hbWUsIGF0dHJzKToKLSAgICAgICAgcHJpbnQgJ1N0YXJ0IGVsZW1lbnQ6XG5cdCcsIG5hbWUsIGF0dHJzCisgICAgICAgIHByaW50ICdTdGFydCBlbGVtZW50OlxuXHQnLCByZXByKG5hbWUpLCBhdHRycwogICAgICAgICAKICAgICBkZWYgRW5kRWxlbWVudEhhbmRsZXIoc2VsZiwgbmFtZSk6Ci0gICAgICAgIHByaW50ICdFbmQgZWxlbWVudDpcblx0JywgbmFtZQorICAgICAgICBwcmludCAnRW5kIGVsZW1lbnQ6XG5cdCcsIHJlcHIobmFtZSkKIAogICAgIGRlZiBDaGFyYWN0ZXJEYXRhSGFuZGxlcihzZWxmLCBkYXRhKToKICAgICAgICAgZGF0YSA9IHN0cmluZy5zdHJpcChkYXRhKQpAQCAtMjIsMTMgKzIyLDEzIEBACiAgICAgICAgICAgICBwcmludCAnXHQnLCByZXByKGRhdGEpCiAKICAgICBkZWYgUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcihzZWxmLCB0YXJnZXQsIGRhdGEpOgotICAgICAgICBwcmludCAnUEk6XG5cdCcsIHRhcmdldCwgZGF0YQorICAgICAgICBwcmludCAnUEk6XG5cdCcsIHJlcHIodGFyZ2V0KSwgcmVwcihkYXRhKQogCiAgICAgZGVmIFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIoc2VsZiwgcHJlZml4LCB1cmkpOgotICAgICAgICBwcmludCAnTlMgZGVjbDpcblx0JywgcHJlZml4LCB1cmkKKyAgICAgICAgcHJpbnQgJ05TIGRlY2w6XG5cdCcsIHJlcHIocHJlZml4KSwgcmVwcih1cmkpCiAKICAgICBkZWYgRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIoc2VsZiwgcHJlZml4KToKLSAgICAgICAgcHJpbnQgJ0VuZCBvZiBOUyBkZWNsOlxuXHQnLCBwcmVmaXgKKyAgICAgICAgcHJpbnQgJ0VuZCBvZiBOUyBkZWNsOlxuXHQnLCByZXByKHByZWZpeCkKIAogICAgIGRlZiBTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIoc2VsZik6CiAgICAgICAgIHByaW50ICdTdGFydCBvZiBDREFUQSBzZWN0aW9uJwpAQCAtNTEsOCArNTEsOSBAQAogICAgICAgICBwcmludCAnTm90IHN0YW5kYWxvbmUnCiAgICAgICAgIHJldHVybiAxCiAgICAgICAgIAotICAgIGRlZiBFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoc2VsZiwgY29udGV4dCwgYmFzZSwgc3lzSWQsIHB1YklkKToKLSAgICAgICAgcHJpbnQgJ0V4dGVybmFsIGVudGl0eSByZWY6JywgY29udGV4dCwgYmFzZSwgc3lzSWQsIHB1YklkCisgICAgZGVmIEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcihzZWxmLCAqYXJncyk6CisgICAgICAgIGNvbnRleHQsIGJhc2UsIHN5c0lkLCBwdWJJZCA9IGFyZ3MKKyAgICAgICAgcHJpbnQgJ0V4dGVybmFsIGVudGl0eSByZWY6JywgYXJncwogICAgICAgICByZXR1cm4gMQogCiAgICAgZGVmIERlZmF1bHRIYW5kbGVyKHNlbGYsIHVzZXJEYXRhKToKQEAgLTY0LDcgKzY1LDE0IEBACiAKIG91dCA9IE91dHB1dHRlcigpCiBwYXJzZXIgPSBweWV4cGF0LlBhcnNlckNyZWF0ZShuYW1lc3BhY2Vfc2VwYXJhdG9yPSchJykKLWZvciBuYW1lIGluIFsnU3RhcnRFbGVtZW50SGFuZGxlcicsICdFbmRFbGVtZW50SGFuZGxlcicsCisKKyMgVGVzdCBnZXR0aW5nL3NldHRpbmcgcmV0dXJuc191bmljb2RlCitwYXJzZXIucmV0dXJuc191bmljb2RlID0gMCA7IGFzc2VydCBwYXJzZXIucmV0dXJuc191bmljb2RlID09IDAKK3BhcnNlci5yZXR1cm5zX3VuaWNvZGUgPSAxIDsgYXNzZXJ0IHBhcnNlci5yZXR1cm5zX3VuaWNvZGUgPT0gMQorcGFyc2VyLnJldHVybnNfdW5pY29kZSA9IDIgOyBhc3NlcnQgcGFyc2VyLnJldHVybnNfdW5pY29kZSA9PSAxCitwYXJzZXIucmV0dXJuc191bmljb2RlID0gMCA7IGFzc2VydCBwYXJzZXIucmV0dXJuc191bmljb2RlID09IDAKKworSEFORExFUl9OQU1FUyA9IFsnU3RhcnRFbGVtZW50SGFuZGxlcicsICdFbmRFbGVtZW50SGFuZGxlcicsCiAgICAgICAgICAgICAgJ0NoYXJhY3RlckRhdGFIYW5kbGVyJywgJ1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXInLAogICAgICAgICAgICAgICdVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyJywgJ05vdGF0aW9uRGVjbEhhbmRsZXInLAogICAgICAgICAgICAgICdTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyJywgJ0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyJywKQEAgLTczLDcgKzgxLDggQEAKICAgICAgICAgICAgICAnRGVmYXVsdEhhbmRsZXInLCAnRGVmYXVsdEhhbmRsZXJFeHBhbmQnLAogICAgICAgICAgICAgICMnTm90U3RhbmRhbG9uZUhhbmRsZXInLAogICAgICAgICAgICAgICdFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXInCi0gICAgICAgICAgICAgXToKKyAgICAgICAgICAgICBdCitmb3IgbmFtZSBpbiBIQU5ETEVSX05BTUVTOgogICAgIHNldGF0dHIocGFyc2VyLCBuYW1lLCBnZXRhdHRyKG91dCwgbmFtZSkgKQogCiBkYXRhID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgc3RhbmRhbG9uZT0ibm8iPz4KQEAgLTg4LDcgKzk3LDcgQEAKICV1bnBhcnNlZF9lbnRpdHk7CiBdPgogCi08cm9vdD4KKzxyb290IGF0dHIxPSJ2YWx1ZTEiIGF0dHIyPSJ2YWx1ZTImIzgwMDA7Ij4KIDxteW5zOnN1YmVsZW1lbnQgeG1sbnM6bXlucz0iaHR0cDovL3d3dy5weXRob24ub3JnL25hbWVzcGFjZSI+CiAgICAgIENvbnRlbnRzIG9mIHN1YmVsZW1lbnRzCiA8L215bnM6c3ViZWxlbWVudD4KQEAgLTk3LDYgKzEwNiw4IEBACiA8L3Jvb3Q+CiAiIiIKIAorIyBQcm9kdWNlIFVURi04IG91dHB1dAorcGFyc2VyLnJldHVybnNfdW5pY29kZSA9IDAKIHRyeToKICAgICBwYXJzZXIuUGFyc2UoZGF0YSwgMSkKIGV4Y2VwdCBweWV4cGF0LmVycm9yOgpAQCAtMTA1LDMgKzExNiwzMyBAQAogICAgIHByaW50ICcqKiBDb2x1bW4nLCBwYXJzZXIuRXJyb3JDb2x1bW5OdW1iZXIKICAgICBwcmludCAnKiogQnl0ZScsIHBhcnNlci5FcnJvckJ5dGVJbmRleAogCisjIFRyeSB0aGUgcGFyc2UgYWdhaW4sIHRoaXMgdGltZSBwcm9kdWNpbmcgVW5pY29kZSBvdXRwdXQKK3BhcnNlciA9IHB5ZXhwYXQuUGFyc2VyQ3JlYXRlKG5hbWVzcGFjZV9zZXBhcmF0b3I9JyEnKQorcGFyc2VyLnJldHVybnNfdW5pY29kZSA9IDEKKworZm9yIG5hbWUgaW4gSEFORExFUl9OQU1FUzoKKyAgICBzZXRhdHRyKHBhcnNlciwgbmFtZSwgZ2V0YXR0cihvdXQsIG5hbWUpICkKK3RyeToKKyAgICBwYXJzZXIuUGFyc2UoZGF0YSwgMSkKK2V4Y2VwdCBweWV4cGF0LmVycm9yOgorICAgIHByaW50ICcqKiBFcnJvcicsIHBhcnNlci5FcnJvckNvZGUsIHB5ZXhwYXQuRXJyb3JTdHJpbmcoIHBhcnNlci5FcnJvckNvZGUpCisgICAgcHJpbnQgJyoqIExpbmUnLCBwYXJzZXIuRXJyb3JMaW5lTnVtYmVyCisgICAgcHJpbnQgJyoqIENvbHVtbicsIHBhcnNlci5FcnJvckNvbHVtbk51bWJlcgorICAgIHByaW50ICcqKiBCeXRlJywgcGFyc2VyLkVycm9yQnl0ZUluZGV4CisKKyMgVHJ5IHBhcnNpbmcgYSBmaWxlCitwYXJzZXIgPSBweWV4cGF0LlBhcnNlckNyZWF0ZShuYW1lc3BhY2Vfc2VwYXJhdG9yPSchJykKK3BhcnNlci5yZXR1cm5zX3VuaWNvZGUgPSAxCisKK2ZvciBuYW1lIGluIEhBTkRMRVJfTkFNRVM6CisgICAgc2V0YXR0cihwYXJzZXIsIG5hbWUsIGdldGF0dHIob3V0LCBuYW1lKSApCitpbXBvcnQgU3RyaW5nSU8KK2ZpbGUgPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQordHJ5OgorICAgIHBhcnNlci5QYXJzZUZpbGUoZmlsZSkKK2V4Y2VwdCBweWV4cGF0LmVycm9yOgorICAgIHByaW50ICcqKiBFcnJvcicsIHBhcnNlci5FcnJvckNvZGUsIHB5ZXhwYXQuRXJyb3JTdHJpbmcoIHBhcnNlci5FcnJvckNvZGUpCisgICAgcHJpbnQgJyoqIExpbmUnLCBwYXJzZXIuRXJyb3JMaW5lTnVtYmVyCisgICAgcHJpbnQgJyoqIENvbHVtbicsIHBhcnNlci5FcnJvckNvbHVtbk51bWJlcgorICAgIHByaW50ICcqKiBCeXRlJywgcGFyc2VyLkVycm9yQnl0ZUluZGV4CisKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3Rfc29jLnB5IGIvTGliL2Rvcy04eDMvdGVzdF9zb2MucHkKaW5kZXggODMxMzVmOS4uOTJiOTMzNiAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF9zb2MucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9zb2MucHkKQEAgLTk3LDcgKzk3LDcgQEAKICAgICBpZiBub3QgY2FuZm9yayBvciBvcy5mb3JrKCk6CiAgICAgICAgICMgcGFyZW50IGlzIHNlcnZlcgogICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQotICAgICAgICBzLmJpbmQoKGhvc3RuYW1lLCBQT1JUKSkKKyAgICAgICAgcy5iaW5kKCgiMTI3LjAuMC4xIiwgUE9SVCkpCiAgICAgICAgIHMubGlzdGVuKDEpCiAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICBwcmludCAncGFyZW50IGFjY2VwdGluZycKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgcHJpbnQgJ2NoaWxkIGNvbm5lY3RpbmcnCi0gICAgICAgICAgICBzLmNvbm5lY3QoKGhvc3RuYW1lLCBQT1JUKSkKKyAgICAgICAgICAgIHMuY29ubmVjdCgoIjEyNy4wLjAuMSIsIFBPUlQpKQogICAgICAgICAgICAgbXNnID0gJ3NvY2tldCB0ZXN0JwogICAgICAgICAgICAgcy5zZW5kKG1zZykKICAgICAgICAgICAgIGRhdGEgPSBzLnJlY3YoMTAyNCkKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3Rfc3RyLnB5IGIvTGliL2Rvcy04eDMvdGVzdF9zdHIucHkKaW5kZXggYmQzMTA1OC4uZWM1N2MyNiAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF9zdHIucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF9zdHIucHkKQEAgLTEsMTIgKzEsMjMgQEAKIGZyb20gdGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlCi1pbXBvcnQgc3Ryb3AsIHN5cworaW1wb3J0IHN0cmluZywgc3lzCisKKyMgWFhYOiBrbHVkZ2UuLi4gc2hvcnQgY2lyY3VpdCBpZiBzdHJpbmdzIGRvbid0IGhhdmUgbWV0aG9kcwordHJ5OgorICAgICcnLmpvaW4KK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICByYWlzZSBJbXBvcnRFcnJvcgogCiBkZWYgdGVzdChuYW1lLCBpbnB1dCwgb3V0cHV0LCAqYXJncyk6CiAgICAgaWYgdmVyYm9zZToKICAgICAgICAgcHJpbnQgJ3N0cmluZy4lcyVzID0/ICVzLi4uICcgJSAobmFtZSwgKGlucHV0LCkgKyBhcmdzLCBvdXRwdXQpLAotICAgIGYgPSBnZXRhdHRyKHN0cm9wLCBuYW1lKQogICAgIHRyeToKLSAgICAgICAgdmFsdWUgPSBhcHBseShmLCAoaW5wdXQsKSArIGFyZ3MpCisgICAgICAgICMgUHJlZmVyIHN0cmluZyBtZXRob2RzIG92ZXIgc3RyaW5nIG1vZHVsZSBmdW5jdGlvbnMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IGdldGF0dHIoaW5wdXQsIG5hbWUpCisgICAgICAgICAgICB2YWx1ZSA9IGFwcGx5KGYsIGFyZ3MpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGYgPSBnZXRhdHRyKHN0cmluZywgbmFtZSkKKyAgICAgICAgICAgIHZhbHVlID0gYXBwbHkoZiwgKGlucHV0LCkgKyBhcmdzKQogICAgIGV4Y2VwdDoKICAgICAgICAgIHZhbHVlID0gc3lzLmV4Y190eXBlCiAgICAgaWYgdmFsdWUgIT0gb3V0cHV0OgpAQCAtMzQsNyArNDUsNTIgQEAKIHRlc3QoJ2ZpbmQnLCAnYWJjZGVmZ2hpYWJjJywgLTEsICdkZWYnLCA0KQogdGVzdCgncmZpbmQnLCAnYWJjZGVmZ2hpYWJjJywgOSwgJ2FiYycpCiB0ZXN0KCdsb3dlcicsICdIZUxMbycsICdoZWxsbycpCit0ZXN0KCdsb3dlcicsICdoZWxsbycsICdoZWxsbycpCiB0ZXN0KCd1cHBlcicsICdIZUxMbycsICdIRUxMTycpCit0ZXN0KCd1cHBlcicsICdIRUxMTycsICdIRUxMTycpCisKK3Rlc3QoJ3RpdGxlJywgJyBoZWxsbyAnLCAnIEhlbGxvICcpCit0ZXN0KCd0aXRsZScsICdoZWxsbyAnLCAnSGVsbG8gJykKK3Rlc3QoJ3RpdGxlJywgImZPck1hVCB0aElzIGFTIHRpdExlIFN0cmluZyIsICdGb3JtYXQgVGhpcyBBcyBUaXRsZSBTdHJpbmcnKQordGVzdCgndGl0bGUnLCAiZk9yTWFULHRoSXMtYVMqdGl0TGU7U3RyaW5nIiwgJ0Zvcm1hdCxUaGlzLUFzKlRpdGxlO1N0cmluZycpCit0ZXN0KCd0aXRsZScsICJnZXRJbnQiLCAnR2V0aW50JykKKwordGVzdCgnZXhwYW5kdGFicycsICdhYmNccmFiXHRkZWZcbmdcdGhpJywgJ2FiY1xyYWIgICAgICBkZWZcbmcgICAgICAgaGknKQordGVzdCgnZXhwYW5kdGFicycsICdhYmNccmFiXHRkZWZcbmdcdGhpJywgJ2FiY1xyYWIgICAgICBkZWZcbmcgICAgICAgaGknLCA4KQordGVzdCgnZXhwYW5kdGFicycsICdhYmNccmFiXHRkZWZcbmdcdGhpJywgJ2FiY1xyYWIgIGRlZlxuZyAgIGhpJywgNCkKK3Rlc3QoJ2V4cGFuZHRhYnMnLCAnYWJjXHJcbmFiXHRkZWZcbmdcdGhpJywgJ2FiY1xyXG5hYiAgZGVmXG5nICAgaGknLCA0KQorCit0ZXN0KCdpc2xvd2VyJywgJ2EnLCAxKQordGVzdCgnaXNsb3dlcicsICdBJywgMCkKK3Rlc3QoJ2lzbG93ZXInLCAnXG4nLCAwKQordGVzdCgnaXNsb3dlcicsICdhYmMnLCAxKQordGVzdCgnaXNsb3dlcicsICdhQmMnLCAwKQordGVzdCgnaXNsb3dlcicsICdhYmNcbicsIDEpCisKK3Rlc3QoJ2lzdXBwZXInLCAnYScsIDApCit0ZXN0KCdpc3VwcGVyJywgJ0EnLCAxKQordGVzdCgnaXN1cHBlcicsICdcbicsIDApCit0ZXN0KCdpc3VwcGVyJywgJ0FCQycsIDEpCit0ZXN0KCdpc3VwcGVyJywgJ0FiQycsIDApCit0ZXN0KCdpc3VwcGVyJywgJ0FCQ1xuJywgMSkKKwordGVzdCgnaXN0aXRsZScsICdhJywgMCkKK3Rlc3QoJ2lzdGl0bGUnLCAnQScsIDEpCit0ZXN0KCdpc3RpdGxlJywgJ1xuJywgMCkKK3Rlc3QoJ2lzdGl0bGUnLCAnQSBUaXRsZWNhc2VkIExpbmUnLCAxKQordGVzdCgnaXN0aXRsZScsICdBXG5UaXRsZWNhc2VkIExpbmUnLCAxKQordGVzdCgnaXN0aXRsZScsICdBIFRpdGxlY2FzZWQsIExpbmUnLCAxKQordGVzdCgnaXN0aXRsZScsICdOb3QgYSBjYXBpdGFsaXplZCBTdHJpbmcnLCAwKQordGVzdCgnaXN0aXRsZScsICdOb3RcdGEgVGl0bGVjYXNlIFN0cmluZycsIDApCit0ZXN0KCdpc3RpdGxlJywgJ05vdC0tYSBUaXRsZWNhc2UgU3RyaW5nJywgMCkKKwordGVzdCgnc3BsaXRsaW5lcycsICJhYmNcbmRlZlxuXHJnaGkiLCBbJ2FiYycsICdkZWYnLCAnJywgJ2doaSddKQordGVzdCgnc3BsaXRsaW5lcycsICJhYmNcbmRlZlxuXHJcbmdoaSIsIFsnYWJjJywgJ2RlZicsICcnLCAnZ2hpJ10pCit0ZXN0KCdzcGxpdGxpbmVzJywgImFiY1xuZGVmXHJcbmdoaSIsIFsnYWJjJywgJ2RlZicsICdnaGknXSkKK3Rlc3QoJ3NwbGl0bGluZXMnLCAiYWJjXG5kZWZcclxuZ2hpXG4iLCBbJ2FiYycsICdkZWYnLCAnZ2hpJ10pCit0ZXN0KCdzcGxpdGxpbmVzJywgImFiY1xuZGVmXHJcbmdoaVxuXHIiLCBbJ2FiYycsICdkZWYnLCAnZ2hpJywgJyddKQordGVzdCgnc3BsaXRsaW5lcycsICJcbmFiY1xuZGVmXHJcbmdoaVxuXHIiLCBbJycsICdhYmMnLCAnZGVmJywgJ2doaScsICcnXSkKK3Rlc3QoJ3NwbGl0bGluZXMnLCAiXG5hYmNcbmRlZlxyXG5naGlcblxyIiwgWydcbicsICdhYmNcbicsICdkZWZcclxuJywgJ2doaVxuJywgJ1xyJ10sIDEpCiAKIHRyYW5zdGFibGUgPSAnXDAwMFwwMDFcMDAyXDAwM1wwMDRcMDA1XDAwNlwwMDdcMDEwXDAxMVwwMTJcMDEzXDAxNFwwMTVcMDE2XDAxN1wwMjBcMDIxXDAyMlwwMjNcMDI0XDAyNVwwMjZcMDI3XDAzMFwwMzFcMDMyXDAzM1wwMzRcMDM1XDAzNlwwMzcgISIjJCUmXCcoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxdXl9geHl6ZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+XDE3N1wyMDBcMjAxXDIwMlwyMDNcMjA0XDIwNVwyMDZcMjA3XDIxMFwyMTFcMjEyXDIxM1wyMTRcMjE1XDIxNlwyMTdcMjIwXDIyMVwyMjJcMjIzXDIyNFwyMjVcMjI2XDIyN1wyMzBcMjMxXDIzMlwyMzNcMjM0XDIzNVwyMzZcMjM3XDI0MFwyNDFcMjQyXDI0M1wyNDRcMjQ1XDI0NlwyNDdcMjUwXDI1MVwyNTJcMjUzXDI1NFwyNTVcMjU2XDI1N1wyNjBcMjYxXDI2MlwyNjNcMjY0XDI2NVwyNjZcMjY3XDI3MFwyNzFcMjcyXDI3M1wyNzRcMjc1XDI3NlwyNzdcMzAwXDMwMVwzMDJcMzAzXDMwNFwzMDVcMzA2XDMwN1wzMTBcMzExXDMxMlwzMTNcMzE0XDMxNVwzMTZcMzE3XDMyMFwzMjFcMzIyXDMyM1wzMjRcMzI1XDMyNlwzMjdcMzMwXDMzMVwzMzJcMzMzXDMzNFwzMzVcMzM2XDMzN1wzNDBcMzQxXDM0MlwzNDNcMzQ0XDM0NVwzNDZcMzQ3XDM1MFwzNTFcMzUyXDM1M1wzNTRcMzU1XDM1NlwzNTdcMzYwXDM2MVwzNjJcMzYzXDM2NFwzNjVcMzY2XDM2N1wzNzBcMzcxXDM3MlwzNzNcMzc0XDM3NVwzNzZcMzc3JwogCkBAIC00OSw4ICsxMDUsOSBAQAogdGVzdCgnc3BsaXQnLCAnYSBiIGMgZCcsIFsnYScsICdiJywgJ2MgZCddLCBOb25lLCAyKQogdGVzdCgnc3BsaXQnLCAnYSBiIGMgZCcsIFsnYScsICdiJywgJ2MnLCAnZCddLCBOb25lLCAzKQogdGVzdCgnc3BsaXQnLCAnYSBiIGMgZCcsIFsnYScsICdiJywgJ2MnLCAnZCddLCBOb25lLCA0KQotdGVzdCgnc3BsaXQnLCAnYSBiIGMgZCcsIFsnYScsICdiJywgJ2MnLCAnZCddLCBOb25lLCAwKQordGVzdCgnc3BsaXQnLCAnYSBiIGMgZCcsIFsnYSBiIGMgZCddLCBOb25lLCAwKQogdGVzdCgnc3BsaXQnLCAnYSAgYiAgYyAgZCcsIFsnYScsICdiJywgJ2MgIGQnXSwgTm9uZSwgMikKK3Rlc3QoJ3NwbGl0JywgJ2EgYiBjIGQgJywgWydhJywgJ2InLCAnYycsICdkJ10pCiAKICMgam9pbiBub3cgd29ya3Mgd2l0aCBhbnkgc2VxdWVuY2UgdHlwZQogY2xhc3MgU2VxdWVuY2U6CkBAIC02MSwyNyArMTE4LDY4IEBACiB0ZXN0KCdqb2luJywgWydhJywgJ2InLCAnYycsICdkJ10sICdhIGIgYyBkJykKIHRlc3QoJ2pvaW4nLCAoJ2EnLCAnYicsICdjJywgJ2QnKSwgJ2FiY2QnLCAnJykKIHRlc3QoJ2pvaW4nLCBTZXF1ZW5jZSgpLCAndyB4IHkgeicpCit0ZXN0KCdqb2luJywgNywgVHlwZUVycm9yKQorCitjbGFzcyBCYWRTZXEoU2VxdWVuY2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKTogc2VsZi5zZXEgPSBbNywgJ2hlbGxvJywgMTIzTF0KKwordGVzdCgnam9pbicsIEJhZFNlcSgpLCBUeXBlRXJyb3IpCiAKICMgdHJ5IGEgZmV3IGxvbmcgb25lcwotcHJpbnQgc3Ryb3Auam9pbihbJ3gnICogMTAwXSAqIDEwMCwgJzonKQotcHJpbnQgc3Ryb3Auam9pbigoJ3gnICogMTAwLCkgKiAxMDAsICc6JykKK3ByaW50IHN0cmluZy5qb2luKFsneCcgKiAxMDBdICogMTAwLCAnOicpCitwcmludCBzdHJpbmcuam9pbigoJ3gnICogMTAwLCkgKiAxMDAsICc6JykKIAogdGVzdCgnc3RyaXAnLCAnICAgaGVsbG8gICAnLCAnaGVsbG8nKQogdGVzdCgnbHN0cmlwJywgJyAgIGhlbGxvICAgJywgJ2hlbGxvICAgJykKIHRlc3QoJ3JzdHJpcCcsICcgICBoZWxsbyAgICcsICcgICBoZWxsbycpCit0ZXN0KCdzdHJpcCcsICdoZWxsbycsICdoZWxsbycpCiAKIHRlc3QoJ3N3YXBjYXNlJywgJ0hlTExvIGNPbXBVdGVScycsICdoRWxsTyBDb01QdVRFclMnKQogdGVzdCgndHJhbnNsYXRlJywgJ3h5emFiY2RlZicsICd4eXp4eXonLCB0cmFuc3RhYmxlLCAnZGVmJykKIAordGFibGUgPSBzdHJpbmcubWFrZXRyYW5zKCdhJywgJ0EnKQordGVzdCgndHJhbnNsYXRlJywgJ2FiYycsICdBYmMnLCB0YWJsZSkKK3Rlc3QoJ3RyYW5zbGF0ZScsICd4eXonLCAneHl6JywgdGFibGUpCisKIHRlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAnb25lQHR3byF0aHJlZSEnLCAnIScsICdAJywgMSkKK3Rlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAnb25ldHdvdGhyZWUnLCAnIScsICcnKQogdGVzdCgncmVwbGFjZScsICdvbmUhdHdvIXRocmVlIScsICdvbmVAdHdvQHRocmVlIScsICchJywgJ0AnLCAyKQogdGVzdCgncmVwbGFjZScsICdvbmUhdHdvIXRocmVlIScsICdvbmVAdHdvQHRocmVlQCcsICchJywgJ0AnLCAzKQogdGVzdCgncmVwbGFjZScsICdvbmUhdHdvIXRocmVlIScsICdvbmVAdHdvQHRocmVlQCcsICchJywgJ0AnLCA0KQotdGVzdCgncmVwbGFjZScsICdvbmUhdHdvIXRocmVlIScsICdvbmVAdHdvQHRocmVlQCcsICchJywgJ0AnLCAwKQordGVzdCgncmVwbGFjZScsICdvbmUhdHdvIXRocmVlIScsICdvbmUhdHdvIXRocmVlIScsICchJywgJ0AnLCAwKQogdGVzdCgncmVwbGFjZScsICdvbmUhdHdvIXRocmVlIScsICdvbmVAdHdvQHRocmVlQCcsICchJywgJ0AnKQogdGVzdCgncmVwbGFjZScsICdvbmUhdHdvIXRocmVlIScsICdvbmUhdHdvIXRocmVlIScsICd4JywgJ0AnKQogdGVzdCgncmVwbGFjZScsICdvbmUhdHdvIXRocmVlIScsICdvbmUhdHdvIXRocmVlIScsICd4JywgJ0AnLCAyKQogCi1zdHJvcC53aGl0ZXNwYWNlCi1zdHJvcC5sb3dlcmNhc2UKLXN0cm9wLnVwcGVyY2FzZQordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsIDEsICdoZScpCit0ZXN0KCdzdGFydHN3aXRoJywgJ2hlbGxvJywgMSwgJ2hlbGxvJykKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAwLCAnaGVsbG8gd29ybGQnKQordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsIDEsICcnKQordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsIDAsICdlbGxvJykKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAxLCAnZWxsbycsIDEpCit0ZXN0KCdzdGFydHN3aXRoJywgJ2hlbGxvJywgMSwgJ28nLCA0KQordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsIDAsICdvJywgNSkKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAxLCAnJywgNSkKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAwLCAnbG8nLCA2KQordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsb3dvcmxkJywgMSwgJ2xvd28nLCAzKQordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsb3dvcmxkJywgMSwgJ2xvd28nLCAzLCA3KQordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsb3dvcmxkJywgMCwgJ2xvd28nLCAzLCA2KQorCit0ZXN0KCdlbmRzd2l0aCcsICdoZWxsbycsIDEsICdsbycpCit0ZXN0KCdlbmRzd2l0aCcsICdoZWxsbycsIDAsICdoZScpCit0ZXN0KCdlbmRzd2l0aCcsICdoZWxsbycsIDEsICcnKQordGVzdCgnZW5kc3dpdGgnLCAnaGVsbG8nLCAwLCAnaGVsbG8gd29ybGQnKQordGVzdCgnZW5kc3dpdGgnLCAnaGVsbG93b3JsZCcsIDAsICd3b3JsJykKK3Rlc3QoJ2VuZHN3aXRoJywgJ2hlbGxvd29ybGQnLCAxLCAnd29ybCcsIDMsIDkpCit0ZXN0KCdlbmRzd2l0aCcsICdoZWxsb3dvcmxkJywgMSwgJ3dvcmxkJywgMywgMTIpCit0ZXN0KCdlbmRzd2l0aCcsICdoZWxsb3dvcmxkJywgMSwgJ2xvd28nLCAxLCA3KQordGVzdCgnZW5kc3dpdGgnLCAnaGVsbG93b3JsZCcsIDEsICdsb3dvJywgMiwgNykKK3Rlc3QoJ2VuZHN3aXRoJywgJ2hlbGxvd29ybGQnLCAxLCAnbG93bycsIDMsIDcpCit0ZXN0KCdlbmRzd2l0aCcsICdoZWxsb3dvcmxkJywgMCwgJ2xvd28nLCA0LCA3KQordGVzdCgnZW5kc3dpdGgnLCAnaGVsbG93b3JsZCcsIDAsICdsb3dvJywgMywgOCkKK3Rlc3QoJ2VuZHN3aXRoJywgJ2FiJywgMCwgJ2FiJywgMCwgMSkKK3Rlc3QoJ2VuZHN3aXRoJywgJ2FiJywgMCwgJ2FiJywgMCwgMCkKKworc3RyaW5nLndoaXRlc3BhY2UKK3N0cmluZy5sb3dlcmNhc2UKK3N0cmluZy51cHBlcmNhc2UKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3RfdGltLnB5IGIvTGliL2Rvcy04eDMvdGVzdF90aW0ucHkKaW5kZXggMDNkMDgxZS4uNWRiYzg5NSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF90aW0ucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF90aW0ucHkKQEAgLTEsMzkgKzEsMjEgQEAKLWltcG9ydCB0aW1lCitmcm9tIHRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZQoraW1wb3J0IHRpbWluZwogCi10aW1lLmFsdHpvbmUKLXRpbWUuY2xvY2soKQotdCA9IHRpbWUudGltZSgpCi10aW1lLmFzY3RpbWUodGltZS5nbXRpbWUodCkpCi1pZiB0aW1lLmN0aW1lKHQpIDw+IHRpbWUuYXNjdGltZSh0aW1lLmxvY2FsdGltZSh0KSk6Ci0gICAgcHJpbnQgJ3RpbWUuY3RpbWUodCkgPD4gdGltZS5hc2N0aW1lKHRpbWUubG9jYWx0aW1lKHQpKScKLQotdGltZS5kYXlsaWdodAotaWYgbG9uZyh0aW1lLm1rdGltZSh0aW1lLmxvY2FsdGltZSh0KSkpIDw+IGxvbmcodCk6Ci0gICAgcHJpbnQgJ3RpbWUubWt0aW1lKHRpbWUubG9jYWx0aW1lKHQpKSA8PiB0JwotCi10aW1lLnNsZWVwKDEuMikKLXR0ID0gdGltZS5nbXRpbWUodCkKLWZvciBkaXJlY3RpdmUgaW4gKCdhJywgJ0EnLCAnYicsICdCJywgJ2MnLCAnZCcsICdIJywgJ0knLAotICAgICAgICAgICAgICAgICAgJ2onLCAnbScsICdNJywgJ3AnLCAnUycsCi0gICAgICAgICAgICAgICAgICAnVScsICd3JywgJ1cnLCAneCcsICdYJywgJ3knLCAnWScsICdaJywgJyUnKToKLSAgICBmb3JtYXQgPSAnICUnICsgZGlyZWN0aXZlCi0gICAgdHJ5OgotICAgICAgICB0aW1lLnN0cmZ0aW1lKGZvcm1hdCwgdHQpCi0gICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgIHByaW50ICdjb252ZXJzaW9uIHNwZWNpZmllcjonLCBmb3JtYXQsICcgZmFpbGVkLicKLQotdGltZS50aW1lem9uZQotdGltZS50em5hbWUKLQotIyBleHBlY3RlZCBlcnJvcnMKLXRyeToKLSAgICB0aW1lLmFzY3RpbWUoMCkKLWV4Y2VwdCBUeXBlRXJyb3I6CityID0gcmFuZ2UoMTAwMDAwKQoraWYgdmVyYm9zZToKKyAgICBwcmludCAnc3RhcnRpbmcuLi4nCit0aW1pbmcuc3RhcnQoKQorZm9yIGkgaW4gcjoKICAgICBwYXNzCit0aW1pbmcuZmluaXNoKCkKK2lmIHZlcmJvc2U6CisgICAgcHJpbnQgJ2ZpbmlzaGVkJwogCi10cnk6Ci0gICAgdGltZS5ta3RpbWUoKDk5OTk5OSwgOTk5OTk5LCA5OTk5OTksIDk5OTk5OSwKLSAgICAgICAgICAgICAgICAgOTk5OTk5LCA5OTk5OTksIDk5OTk5OSwgOTk5OTk5LAotICAgICAgICAgICAgICAgICA5OTk5OTkpKQotZXhjZXB0IE92ZXJmbG93RXJyb3I6Ci0gICAgcGFzcworc2VjcyA9IHRpbWluZy5zZWNvbmRzKCkKK21pbGxpID0gdGltaW5nLm1pbGxpKCkKK21pY3JvID0gdGltaW5nLm1pY3JvKCkKKworaWYgdmVyYm9zZToKKyAgICBwcmludCAnc2Vjb25kczonLCBzZWNzCisgICAgcHJpbnQgJ21pbGxpICA6JywgbWlsbGkKKyAgICBwcmludCAnbWljcm8gIDonLCBtaWNybwpkaWZmIC0tZ2l0IGEvTGliL2Rvcy04eDMvdGVzdF91bmkucHkgYi9MaWIvZG9zLTh4My90ZXN0X3VuaS5weQppbmRleCA0NTQ0OWVlLi42ZGRkMDc3IDEwMDY0NAotLS0gYS9MaWIvZG9zLTh4My90ZXN0X3VuaS5weQorKysgYi9MaWIvZG9zLTh4My90ZXN0X3VuaS5weQpAQCAtMSw0MDEgKzEsNTAgQEAKLSIiIiBUZXN0IHNjcmlwdCBmb3IgdGhlIFVuaWNvZGUgaW1wbGVtZW50YXRpb24uCisiIiIgVGVzdCBzY3JpcHQgZm9yIHRoZSB1bmljb2RlZGF0YSBtb2R1bGUuCiAKIFdyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgogCiAoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgogCi0iIiIKKyIiIiMiCiBmcm9tIHRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZQogaW1wb3J0IHN5cwogCi1kZWYgdGVzdChtZXRob2QsIGlucHV0LCBvdXRwdXQsICphcmdzKToKLSAgICBpZiB2ZXJib3NlOgotICAgICAgICBwcmludCAnJXMuJXMlcyA9PyAlcy4uLiAnICUgKHJlcHIoaW5wdXQpLCBtZXRob2QsIGFyZ3MsIG91dHB1dCksCi0gICAgdHJ5OgotICAgICAgICBmID0gZ2V0YXR0cihpbnB1dCwgbWV0aG9kKQotICAgICAgICB2YWx1ZSA9IGFwcGx5KGYsIGFyZ3MpCi0gICAgZXhjZXB0OgotICAgICAgICB2YWx1ZSA9IHN5cy5leGNfdHlwZQotICAgICAgICBleGMgPSBzeXMuZXhjX2luZm8oKVs6Ml0KLSAgICBlbHNlOgotICAgICAgICBleGMgPSBOb25lCi0gICAgaWYgdmFsdWUgIT0gb3V0cHV0OgotICAgICAgICBpZiB2ZXJib3NlOgotICAgICAgICAgICAgcHJpbnQgJ25vJwotICAgICAgICBwcmludCAnKicsZiwgYGlucHV0YCwgYG91dHB1dGAsIGB2YWx1ZWAKLSAgICAgICAgaWYgZXhjOgotICAgICAgICAgICAgcHJpbnQgJyAgdmFsdWUgPT0gJXM6ICVzJyAlIChleGMpCi0gICAgZWxzZToKLSAgICAgICAgaWYgdmVyYm9zZToKLSAgICAgICAgICAgIHByaW50ICd5ZXMnCisjIFRlc3QgVW5pY29kZSBkYXRhYmFzZSBBUElzCitpbXBvcnQgdW5pY29kZWRhdGEKIAotdGVzdCgnY2FwaXRhbGl6ZScsIHUnIGhlbGxvICcsIHUnIGhlbGxvICcpCi10ZXN0KCdjYXBpdGFsaXplJywgdSdoZWxsbyAnLCB1J0hlbGxvICcpCitwcmludCAnVGVzdGluZyB1bmljb2RlZGF0YSBtb2R1bGUuLi4nLAogCi10ZXN0KCd0aXRsZScsIHUnIGhlbGxvICcsIHUnIEhlbGxvICcpCi10ZXN0KCd0aXRsZScsIHUnaGVsbG8gJywgdSdIZWxsbyAnKQotdGVzdCgndGl0bGUnLCB1ImZPck1hVCB0aElzIGFTIHRpdExlIFN0cmluZyIsIHUnRm9ybWF0IFRoaXMgQXMgVGl0bGUgU3RyaW5nJykKLXRlc3QoJ3RpdGxlJywgdSJmT3JNYVQsdGhJcy1hUyp0aXRMZTtTdHJpbmciLCB1J0Zvcm1hdCxUaGlzLUFzKlRpdGxlO1N0cmluZycpCi10ZXN0KCd0aXRsZScsIHUiZ2V0SW50IiwgdSdHZXRpbnQnKQorYXNzZXJ0IHVuaWNvZGVkYXRhLmRpZ2l0KHUnQScsTm9uZSkgaXMgTm9uZQorYXNzZXJ0IHVuaWNvZGVkYXRhLmRpZ2l0KHUnOScpID09IDkKK2Fzc2VydCB1bmljb2RlZGF0YS5kaWdpdCh1J1x1MjE1YicsTm9uZSkgaXMgTm9uZQorYXNzZXJ0IHVuaWNvZGVkYXRhLmRpZ2l0KHUnXHUyNDY4JykgPT0gOQogCi10ZXN0KCdmaW5kJywgdSdhYmNkZWZnaGlhYmMnLCAwLCB1J2FiYycpCi10ZXN0KCdmaW5kJywgdSdhYmNkZWZnaGlhYmMnLCA5LCB1J2FiYycsIDEpCi10ZXN0KCdmaW5kJywgdSdhYmNkZWZnaGlhYmMnLCAtMSwgdSdkZWYnLCA0KQorYXNzZXJ0IHVuaWNvZGVkYXRhLm51bWVyaWModSdBJyxOb25lKSBpcyBOb25lCithc3NlcnQgdW5pY29kZWRhdGEubnVtZXJpYyh1JzknKSA9PSA5Cithc3NlcnQgdW5pY29kZWRhdGEubnVtZXJpYyh1J1x1MjE1YicpID09IDAuMTI1Cithc3NlcnQgdW5pY29kZWRhdGEubnVtZXJpYyh1J1x1MjQ2OCcpID09IDkuMAogCi10ZXN0KCdyZmluZCcsIHUnYWJjZGVmZ2hpYWJjJywgOSwgdSdhYmMnKQorYXNzZXJ0IHVuaWNvZGVkYXRhLmRlY2ltYWwodSdBJyxOb25lKSBpcyBOb25lCithc3NlcnQgdW5pY29kZWRhdGEuZGVjaW1hbCh1JzknKSA9PSA5Cithc3NlcnQgdW5pY29kZWRhdGEuZGVjaW1hbCh1J1x1MjE1YicsTm9uZSkgaXMgTm9uZQorYXNzZXJ0IHVuaWNvZGVkYXRhLmRlY2ltYWwodSdcdTI0NjgnLE5vbmUpIGlzIE5vbmUKIAotdGVzdCgnbG93ZXInLCB1J0hlTExvJywgdSdoZWxsbycpCi10ZXN0KCdsb3dlcicsIHUnaGVsbG8nLCB1J2hlbGxvJykKK2Fzc2VydCB1bmljb2RlZGF0YS5jYXRlZ29yeSh1J1x1RkZGRScpID09ICdDbicKK2Fzc2VydCB1bmljb2RlZGF0YS5jYXRlZ29yeSh1J2EnKSA9PSAnTGwnCithc3NlcnQgdW5pY29kZWRhdGEuY2F0ZWdvcnkodSdBJykgPT0gJ0x1JwogCi10ZXN0KCd1cHBlcicsIHUnSGVMTG8nLCB1J0hFTExPJykKLXRlc3QoJ3VwcGVyJywgdSdIRUxMTycsIHUnSEVMTE8nKQorYXNzZXJ0IHVuaWNvZGVkYXRhLmJpZGlyZWN0aW9uYWwodSdcdUZGRkUnKSA9PSAnJworYXNzZXJ0IHVuaWNvZGVkYXRhLmJpZGlyZWN0aW9uYWwodScgJykgPT0gJ1dTJworYXNzZXJ0IHVuaWNvZGVkYXRhLmJpZGlyZWN0aW9uYWwodSdBJykgPT0gJ0wnCiAKLWlmIDA6Ci0gICAgdHJhbnN0YWJsZSA9ICdcMDAwXDAwMVwwMDJcMDAzXDAwNFwwMDVcMDA2XDAwN1wwMTBcMDExXDAxMlwwMTNcMDE0XDAxNVwwMTZcMDE3XDAyMFwwMjFcMDIyXDAyM1wwMjRcMDI1XDAyNlwwMjdcMDMwXDAzMVwwMzJcMDMzXDAzNFwwMzVcMDM2XDAzNyAhIiMkJSZcJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXF1eX2B4eXpkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5cMTc3XDIwMFwyMDFcMjAyXDIwM1wyMDRcMjA1XDIwNlwyMDdcMjEwXDIxMVwyMTJcMjEzXDIxNFwyMTVcMjE2XDIxN1wyMjBcMjIxXDIyMlwyMjNcMjI0XDIyNVwyMjZcMjI3XDIzMFwyMzFcMjMyXDIzM1wyMzRcMjM1XDIzNlwyMzdcMjQwXDI0MVwyNDJcMjQzXDI0NFwyNDVcMjQ2XDI0N1wyNTBcMjUxXDI1MlwyNTNcMjU0XDI1NVwyNTZcMjU3XDI2MFwyNjFcMjYyXDI2M1wyNjRcMjY1XDI2NlwyNjdcMjcwXDI3MVwyNzJcMjczXDI3NFwyNzVcMjc2XDI3N1wzMDBcMzAxXDMwMlwzMDNcMzA0XDMwNVwzMDZcMzA3XDMxMFwzMTFcMzEyXDMxM1wzMTRcMzE1XDMxNlwzMTdcMzIwXDMyMVwzMjJcMzIzXDMyNFwzMjVcMzI2XDMyN1wzMzBcMzMxXDMzMlwzMzNcMzM0XDMzNVwzMzZcMzM3XDM0MFwzNDFcMzQyXDM0M1wzNDRcMzQ1XDM0NlwzNDdcMzUwXDM1MVwzNTJcMzUzXDM1NFwzNTVcMzU2XDM1N1wzNjBcMzYxXDM2MlwzNjNcMzY0XDM2NVwzNjZcMzY3XDM3MFwzNzFcMzcyXDM3M1wzNzRcMzc1XDM3NlwzNzcnCithc3NlcnQgdW5pY29kZWRhdGEuZGVjb21wb3NpdGlvbih1J1x1RkZGRScpID09ICcnCithc3NlcnQgdW5pY29kZWRhdGEuZGVjb21wb3NpdGlvbih1J1x1MDBiYycpID09ICc8ZnJhY3Rpb24+IDAwMzEgMjA0NCAwMDM0JwogCi0gICAgdGVzdCgnbWFrZXRyYW5zJywgdSdhYmMnLCB0cmFuc3RhYmxlLCB1J3h5eicpCi0gICAgdGVzdCgnbWFrZXRyYW5zJywgdSdhYmMnLCBWYWx1ZUVycm9yLCB1J3h5enEnKQorYXNzZXJ0IHVuaWNvZGVkYXRhLm1pcnJvcmVkKHUnXHVGRkZFJykgPT0gMAorYXNzZXJ0IHVuaWNvZGVkYXRhLm1pcnJvcmVkKHUnYScpID09IDAKK2Fzc2VydCB1bmljb2RlZGF0YS5taXJyb3JlZCh1J1x1MjIwMScpID09IDEKIAotdGVzdCgnc3BsaXQnLCB1J3RoaXMgaXMgdGhlIHNwbGl0IGZ1bmN0aW9uJywKLSAgICAgW3UndGhpcycsIHUnaXMnLCB1J3RoZScsIHUnc3BsaXQnLCB1J2Z1bmN0aW9uJ10pCi10ZXN0KCdzcGxpdCcsIHUnYXxifGN8ZCcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSwgdSd8JykKLXRlc3QoJ3NwbGl0JywgdSdhfGJ8Y3xkJywgW3UnYScsIHUnYicsIHUnY3xkJ10sIHUnfCcsIDIpCi10ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2IgYyBkJ10sIE5vbmUsIDEpCi10ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2InLCB1J2MgZCddLCBOb25lLCAyKQotdGVzdCgnc3BsaXQnLCB1J2EgYiBjIGQnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10sIE5vbmUsIDMpCi10ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCcsIFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSwgTm9uZSwgNCkKLXRlc3QoJ3NwbGl0JywgdSdhIGIgYyBkJywgW3UnYSBiIGMgZCddLCBOb25lLCAwKQotdGVzdCgnc3BsaXQnLCB1J2EgIGIgIGMgIGQnLCBbdSdhJywgdSdiJywgdSdjICBkJ10sIE5vbmUsIDIpCi10ZXN0KCdzcGxpdCcsIHUnYSBiIGMgZCAnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10pCithc3NlcnQgdW5pY29kZWRhdGEuY29tYmluaW5nKHUnXHVGRkZFJykgPT0gMAorYXNzZXJ0IHVuaWNvZGVkYXRhLmNvbWJpbmluZyh1J2EnKSA9PSAwCithc3NlcnQgdW5pY29kZWRhdGEuY29tYmluaW5nKHUnXHUyMGUxJykgPT0gMjMwCiAKLSMgam9pbiBub3cgd29ya3Mgd2l0aCBhbnkgc2VxdWVuY2UgdHlwZQotY2xhc3MgU2VxdWVuY2U6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOiBzZWxmLnNlcSA9ICd3eHl6JwotICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuc2VxKQotICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKTogcmV0dXJuIHNlbGYuc2VxW2ldCi0KLXRlc3QoJ2pvaW4nLCB1JyAnLCB1J2EgYiBjIGQnLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10pCi10ZXN0KCdqb2luJywgdScnLCB1J2FiY2QnLCAodSdhJywgdSdiJywgdSdjJywgdSdkJykpCi10ZXN0KCdqb2luJywgdScgJywgdSd3IHggeSB6JywgU2VxdWVuY2UoKSkKLXRlc3QoJ2pvaW4nLCB1JyAnLCBUeXBlRXJyb3IsIDcpCi0KLWNsYXNzIEJhZFNlcShTZXF1ZW5jZSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYpOiBzZWxmLnNlcSA9IFs3LCB1J2hlbGxvJywgMTIzTF0KLQotdGVzdCgnam9pbicsIHUnICcsIFR5cGVFcnJvciwgQmFkU2VxKCkpCi0KLXJlc3VsdCA9IHUnJwotZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgIGlmIGkgPiAwOgotICAgICAgICByZXN1bHQgPSByZXN1bHQgKyB1JzonCi0gICAgcmVzdWx0ID0gcmVzdWx0ICsgdSd4JyoxMAotdGVzdCgnam9pbicsIHUnOicsIHJlc3VsdCwgW3UneCcgKiAxMF0gKiAxMCkKLXRlc3QoJ2pvaW4nLCB1JzonLCByZXN1bHQsICh1J3gnICogMTAsKSAqIDEwKQotCi10ZXN0KCdzdHJpcCcsIHUnICAgaGVsbG8gICAnLCB1J2hlbGxvJykKLXRlc3QoJ2xzdHJpcCcsIHUnICAgaGVsbG8gICAnLCB1J2hlbGxvICAgJykKLXRlc3QoJ3JzdHJpcCcsIHUnICAgaGVsbG8gICAnLCB1JyAgIGhlbGxvJykKLXRlc3QoJ3N0cmlwJywgdSdoZWxsbycsIHUnaGVsbG8nKQotCi10ZXN0KCdzd2FwY2FzZScsIHUnSGVMTG8gY09tcFV0ZVJzJywgdSdoRWxsTyBDb01QdVRFclMnKQotCi1pZiAwOgotICAgIHRlc3QoJ3RyYW5zbGF0ZScsIHUneHl6YWJjZGVmJywgdSd4eXp4eXonLCB0cmFuc3RhYmxlLCB1J2RlZicpCi0KLSAgICB0YWJsZSA9IHN0cmluZy5tYWtldHJhbnMoJ2EnLCB1J0EnKQotICAgIHRlc3QoJ3RyYW5zbGF0ZScsIHUnYWJjJywgdSdBYmMnLCB0YWJsZSkKLSAgICB0ZXN0KCd0cmFuc2xhdGUnLCB1J3h5eicsIHUneHl6JywgdGFibGUpCi0KLXRlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvIXRocmVlIScsIHUnIScsIHUnQCcsIDEpCi10ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25ldHdvdGhyZWUnLCAnIScsICcnKQotdGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZUB0d29AdGhyZWUhJywgdSchJywgdSdAJywgMikKLXRlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvQHRocmVlQCcsIHUnIScsIHUnQCcsIDMpCi10ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lQHR3b0B0aHJlZUAnLCB1JyEnLCB1J0AnLCA0KQotdGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZSF0d28hdGhyZWUhJywgdSchJywgdSdAJywgMCkKLXRlc3QoJ3JlcGxhY2UnLCB1J29uZSF0d28hdGhyZWUhJywgdSdvbmVAdHdvQHRocmVlQCcsIHUnIScsIHUnQCcpCi10ZXN0KCdyZXBsYWNlJywgdSdvbmUhdHdvIXRocmVlIScsIHUnb25lIXR3byF0aHJlZSEnLCB1J3gnLCB1J0AnKQotdGVzdCgncmVwbGFjZScsIHUnb25lIXR3byF0aHJlZSEnLCB1J29uZSF0d28hdGhyZWUhJywgdSd4JywgdSdAJywgMikKLQotdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCAxLCB1J2hlJykKLXRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgMSwgdSdoZWxsbycpCi10ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDAsIHUnaGVsbG8gd29ybGQnKQotdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG8nLCAxLCB1JycpCi10ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDAsIHUnZWxsbycpCi10ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnZWxsbycsIDEpCi10ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnbycsIDQpCi10ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDAsIHUnbycsIDUpCi10ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsbycsIDEsIHUnJywgNSkKLXRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvJywgMCwgdSdsbycsIDYpCi10ZXN0KCdzdGFydHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSdsb3dvJywgMykKLXRlc3QoJ3N0YXJ0c3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAzLCA3KQotdGVzdCgnc3RhcnRzd2l0aCcsIHUnaGVsbG93b3JsZCcsIDAsIHUnbG93bycsIDMsIDYpCi0KLXRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsbycsIDEsIHUnbG8nKQotdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvJywgMCwgdSdoZScpCi10ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG8nLCAxLCB1JycpCi10ZXN0KCdlbmRzd2l0aCcsIHUnaGVsbG8nLCAwLCB1J2hlbGxvIHdvcmxkJykKLXRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMCwgdSd3b3JsJykKLXRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSd3b3JsJywgMywgOSkKLXRlc3QoJ2VuZHN3aXRoJywgdSdoZWxsb3dvcmxkJywgMSwgdSd3b3JsZCcsIDMsIDEyKQotdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAxLCA3KQotdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAyLCA3KQotdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAxLCB1J2xvd28nLCAzLCA3KQotdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAwLCB1J2xvd28nLCA0LCA3KQotdGVzdCgnZW5kc3dpdGgnLCB1J2hlbGxvd29ybGQnLCAwLCB1J2xvd28nLCAzLCA4KQotdGVzdCgnZW5kc3dpdGgnLCB1J2FiJywgMCwgdSdhYicsIDAsIDEpCi10ZXN0KCdlbmRzd2l0aCcsIHUnYWInLCAwLCB1J2FiJywgMCwgMCkKLQotdGVzdCgnZXhwYW5kdGFicycsIHUnYWJjXHJhYlx0ZGVmXG5nXHRoaScsIHUnYWJjXHJhYiAgICAgIGRlZlxuZyAgICAgICBoaScpCi10ZXN0KCdleHBhbmR0YWJzJywgdSdhYmNccmFiXHRkZWZcbmdcdGhpJywgdSdhYmNccmFiICAgICAgZGVmXG5nICAgICAgIGhpJywgOCkKLXRlc3QoJ2V4cGFuZHRhYnMnLCB1J2FiY1xyYWJcdGRlZlxuZ1x0aGknLCB1J2FiY1xyYWIgIGRlZlxuZyAgIGhpJywgNCkKLXRlc3QoJ2V4cGFuZHRhYnMnLCB1J2FiY1xyXG5hYlx0ZGVmXG5nXHRoaScsIHUnYWJjXHJcbmFiICBkZWZcbmcgICBoaScsIDQpCi0KLWlmIDA6Ci0gICAgdGVzdCgnY2Fwd29yZHMnLCB1J2FiYyBkZWYgZ2hpJywgdSdBYmMgRGVmIEdoaScpCi0gICAgdGVzdCgnY2Fwd29yZHMnLCB1J2FiY1x0ZGVmXG5naGknLCB1J0FiYyBEZWYgR2hpJykKLSAgICB0ZXN0KCdjYXB3b3JkcycsIHUnYWJjXHQgICBkZWYgIFxuZ2hpJywgdSdBYmMgRGVmIEdoaScpCi0KLSMgQ29tcGFyaXNvbnM6Ci1wcmludCAnVGVzdGluZyBVbmljb2RlIGNvbXBhcmlzb25zLi4uJywKLWFzc2VydCB1J2FiYycgPT0gJ2FiYycKLWFzc2VydCAnYWJjJyA9PSB1J2FiYycKLWFzc2VydCB1J2FiYycgPT0gdSdhYmMnCi1hc3NlcnQgdSdhYmNkJyA+ICdhYmMnCi1hc3NlcnQgJ2FiY2QnID4gdSdhYmMnCi1hc3NlcnQgdSdhYmNkJyA+IHUnYWJjJwotYXNzZXJ0IHUnYWJjJyA8ICdhYmNkJwotYXNzZXJ0ICdhYmMnIDwgdSdhYmNkJwotYXNzZXJ0IHUnYWJjJyA8IHUnYWJjZCcKLXByaW50ICdkb25lLicKLQotdGVzdCgnbGp1c3QnLCB1J2FiYycsICB1J2FiYyAgICAgICAnLCAxMCkKLXRlc3QoJ3JqdXN0JywgdSdhYmMnLCAgdScgICAgICAgYWJjJywgMTApCi10ZXN0KCdjZW50ZXInLCB1J2FiYycsIHUnICAgYWJjICAgICcsIDEwKQotdGVzdCgnbGp1c3QnLCB1J2FiYycsICB1J2FiYyAgICcsIDYpCi10ZXN0KCdyanVzdCcsIHUnYWJjJywgIHUnICAgYWJjJywgNikKLXRlc3QoJ2NlbnRlcicsIHUnYWJjJywgdScgYWJjICAnLCA2KQotdGVzdCgnbGp1c3QnLCB1J2FiYycsIHUnYWJjJywgMikKLXRlc3QoJ3JqdXN0JywgdSdhYmMnLCB1J2FiYycsIDIpCi10ZXN0KCdjZW50ZXInLCB1J2FiYycsIHUnYWJjJywgMikKLQotdGVzdCgnaXNsb3dlcicsIHUnYScsIDEpCi10ZXN0KCdpc2xvd2VyJywgdSdBJywgMCkKLXRlc3QoJ2lzbG93ZXInLCB1J1xuJywgMCkKLXRlc3QoJ2lzbG93ZXInLCB1J1x1MUZGYycsIDApCi10ZXN0KCdpc2xvd2VyJywgdSdhYmMnLCAxKQotdGVzdCgnaXNsb3dlcicsIHUnYUJjJywgMCkKLXRlc3QoJ2lzbG93ZXInLCB1J2FiY1xuJywgMSkKLQotdGVzdCgnaXN1cHBlcicsIHUnYScsIDApCi10ZXN0KCdpc3VwcGVyJywgdSdBJywgMSkKLXRlc3QoJ2lzdXBwZXInLCB1J1xuJywgMCkKLXRlc3QoJ2lzdXBwZXInLCB1J1x1MUZGYycsIDApCi10ZXN0KCdpc3VwcGVyJywgdSdBQkMnLCAxKQotdGVzdCgnaXN1cHBlcicsIHUnQWJDJywgMCkKLXRlc3QoJ2lzdXBwZXInLCB1J0FCQ1xuJywgMSkKLQotdGVzdCgnaXN0aXRsZScsIHUnYScsIDApCi10ZXN0KCdpc3RpdGxlJywgdSdBJywgMSkKLXRlc3QoJ2lzdGl0bGUnLCB1J1xuJywgMCkKLXRlc3QoJ2lzdGl0bGUnLCB1J1x1MUZGYycsIDEpCi10ZXN0KCdpc3RpdGxlJywgdSdBIFRpdGxlY2FzZWQgTGluZScsIDEpCi10ZXN0KCdpc3RpdGxlJywgdSdBXG5UaXRsZWNhc2VkIExpbmUnLCAxKQotdGVzdCgnaXN0aXRsZScsIHUnQSBUaXRsZWNhc2VkLCBMaW5lJywgMSkKLXRlc3QoJ2lzdGl0bGUnLCB1J0dyZWVrIFx1MUZGY2l0bGVjYXNlcyAuLi4nLCAxKQotdGVzdCgnaXN0aXRsZScsIHUnTm90IGEgY2FwaXRhbGl6ZWQgU3RyaW5nJywgMCkKLXRlc3QoJ2lzdGl0bGUnLCB1J05vdFx0YSBUaXRsZWNhc2UgU3RyaW5nJywgMCkKLXRlc3QoJ2lzdGl0bGUnLCB1J05vdC0tYSBUaXRsZWNhc2UgU3RyaW5nJywgMCkKLQotdGVzdCgnc3BsaXRsaW5lcycsIHUiYWJjXG5kZWZcblxyZ2hpIiwgW3UnYWJjJywgdSdkZWYnLCB1JycsIHUnZ2hpJ10pCi10ZXN0KCdzcGxpdGxpbmVzJywgdSJhYmNcbmRlZlxuXHJcbmdoaSIsIFt1J2FiYycsIHUnZGVmJywgdScnLCB1J2doaSddKQotdGVzdCgnc3BsaXRsaW5lcycsIHUiYWJjXG5kZWZcclxuZ2hpIiwgW3UnYWJjJywgdSdkZWYnLCB1J2doaSddKQotdGVzdCgnc3BsaXRsaW5lcycsIHUiYWJjXG5kZWZcclxuZ2hpXG4iLCBbdSdhYmMnLCB1J2RlZicsIHUnZ2hpJ10pCi10ZXN0KCdzcGxpdGxpbmVzJywgdSJhYmNcbmRlZlxyXG5naGlcblxyIiwgW3UnYWJjJywgdSdkZWYnLCB1J2doaScsIHUnJ10pCi10ZXN0KCdzcGxpdGxpbmVzJywgdSJcbmFiY1xuZGVmXHJcbmdoaVxuXHIiLCBbdScnLCB1J2FiYycsIHUnZGVmJywgdSdnaGknLCB1JyddKQotdGVzdCgnc3BsaXRsaW5lcycsIHUiXG5hYmNcbmRlZlxyXG5naGlcblxyIiwgW3UnXG4nLCB1J2FiY1xuJywgdSdkZWZcclxuJywgdSdnaGlcbicsIHUnXHInXSwgMSkKLQotdGVzdCgndHJhbnNsYXRlJywgdSJhYmFiYWJjIiwgdSdiYmJjJywge29yZCgnYScpOk5vbmV9KQotdGVzdCgndHJhbnNsYXRlJywgdSJhYmFiYWJjIiwgdSdpaWljJywge29yZCgnYScpOk5vbmUsIG9yZCgnYicpOm9yZCgnaScpfSkKLXRlc3QoJ3RyYW5zbGF0ZScsIHUiYWJhYmFiYyIsIHUnaWlpeCcsIHtvcmQoJ2EnKTpOb25lLCBvcmQoJ2InKTpvcmQoJ2knKSwgb3JkKCdjJyk6dSd4J30pCi0KLSMgQ29udGFpbnM6Ci1wcmludCAnVGVzdGluZyBVbmljb2RlIGNvbnRhaW5zIG1ldGhvZC4uLicsCi1hc3NlcnQgKCdhJyBpbiB1J2FiZGInKSA9PSAxCi1hc3NlcnQgKCdhJyBpbiB1J2JkYWInKSA9PSAxCi1hc3NlcnQgKCdhJyBpbiB1J2JkYWJhJykgPT0gMQotYXNzZXJ0ICgnYScgaW4gdSdiZGJhJykgPT0gMQotYXNzZXJ0ICgnYScgaW4gdSdiZGJhJykgPT0gMQotYXNzZXJ0ICh1J2EnIGluIHUnYmRiYScpID09IDEKLWFzc2VydCAodSdhJyBpbiB1J2JkYicpID09IDAKLWFzc2VydCAodSdhJyBpbiAnYmRiJykgPT0gMAotYXNzZXJ0ICh1J2EnIGluICdiZGJhJykgPT0gMQotYXNzZXJ0ICh1J2EnIGluICgnYScsMSxOb25lKSkgPT0gMQotYXNzZXJ0ICh1J2EnIGluICgxLE5vbmUsJ2EnKSkgPT0gMQotYXNzZXJ0ICh1J2EnIGluICgxLE5vbmUsdSdhJykpID09IDEKLWFzc2VydCAoJ2EnIGluICgnYScsMSxOb25lKSkgPT0gMQotYXNzZXJ0ICgnYScgaW4gKDEsTm9uZSwnYScpKSA9PSAxCi1hc3NlcnQgKCdhJyBpbiAoMSxOb25lLHUnYScpKSA9PSAxCi1hc3NlcnQgKCdhJyBpbiAoJ3gnLDEsdSd5JykpID09IDAKLWFzc2VydCAoJ2EnIGluICgneCcsMSxOb25lKSkgPT0gMAotcHJpbnQgJ2RvbmUuJwotCi0jIEZvcm1hdHRpbmc6Ci1wcmludCAnVGVzdGluZyBVbmljb2RlIGZvcm1hdHRpbmcgc3RyaW5ncy4uLicsCi1hc3NlcnQgdSIlcywgJXMiICUgKHUiYWJjIiwgImFiYyIpID09IHUnYWJjLCBhYmMnCi1hc3NlcnQgdSIlcywgJXMsICVpLCAlZiwgJTUuMmYiICUgKHUiYWJjIiwgImFiYyIsIDEsIDIsIDMpID09IHUnYWJjLCBhYmMsIDEsIDIuMDAwMDAwLCAgMy4wMCcKLWFzc2VydCB1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgMSwgLTIsIDMpID09IHUnYWJjLCBhYmMsIDEsIC0yLjAwMDAwMCwgIDMuMDAnCi1hc3NlcnQgdSIlcywgJXMsICVpLCAlZiwgJTUuMmYiICUgKHUiYWJjIiwgImFiYyIsIC0xLCAtMiwgMy41KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAgMy41MCcKLWFzc2VydCB1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAzLjU3KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAgMy41NycKLWFzc2VydCB1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAxMDAzLjU3KSA9PSB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAxMDAzLjU3JwotYXNzZXJ0IHUiJWMiICUgKHUiYWJjIiwpID09IHUnYScKLWFzc2VydCB1IiVjIiAlICgiYWJjIiwpID09IHUnYScKLWFzc2VydCB1IiVjIiAlICgzNCwpID09IHUnIicKLWFzc2VydCB1IiVjIiAlICgzNiwpID09IHUnJCcKLWFzc2VydCB1IiVyLCAlciIgJSAodSJhYmMiLCAiYWJjIikgPT0gdSJ1J2FiYycsICdhYmMnIgotYXNzZXJ0IHUiJSh4KXMsICUoeSlzIiAlIHsneCc6dSJhYmMiLCAneSc6ImRlZiJ9ID09IHUnYWJjLCBkZWYnCi1hc3NlcnQgdSIlKHgpcywgJSjkKXMiICUgeyd4Jzp1ImFiYyIsIHUn5CcuZW5jb2RlKCd1dGYtOCcpOiJkZWYifSA9PSB1J2FiYywgZGVmJwotIyBmb3JtYXR0aW5nIGpvYnMgZGVsZWdhdGVkIGZyb20gdGhlIHN0cmluZyBpbXBsZW1lbnRhdGlvbjoKLWFzc2VydCAnLi4uJShmb28pcy4uLicgJSB7J2Zvbyc6dSJhYmMifSA9PSB1Jy4uLmFiYy4uLicKLWFzc2VydCAnLi4uJShmb28pcy4uLicgJSB7J2Zvbyc6ImFiYyJ9ID09ICcuLi5hYmMuLi4nCi1hc3NlcnQgJy4uLiUoZm9vKXMuLi4nICUge3UnZm9vJzoiYWJjIn0gPT0gJy4uLmFiYy4uLicKLWFzc2VydCAnLi4uJShmb28pcy4uLicgJSB7dSdmb28nOnUiYWJjIn0gPT0gdScuLi5hYmMuLi4nCi1hc3NlcnQgJy4uLiUoZm9vKXMuLi4nICUge3UnZm9vJzp1ImFiYyIsJ2RlZic6MTIzfSA9PSAgdScuLi5hYmMuLi4nCi1hc3NlcnQgJy4uLiUoZm9vKXMuLi4nICUge3UnZm9vJzp1ImFiYyIsdSdkZWYnOjEyM30gPT0gdScuLi5hYmMuLi4nCi1hc3NlcnQgJy4uLiVzLi4uJXMuLi4lcy4uLiVzLi4uJyAlICgxLDIsMyx1ImFiYyIpID09IHUnLi4uMS4uLjIuLi4zLi4uYWJjLi4uJwotYXNzZXJ0ICcuLi4lcy4uLicgJSB1ImFiYyIgPT0gdScuLi5hYmMuLi4nCi1wcmludCAnZG9uZS4nCi0KLSMgVGVzdCBidWlsdGluIGNvZGVjcwotcHJpbnQgJ1Rlc3RpbmcgYnVpbHRpbiBjb2RlY3MuLi4nLAotCi1hc3NlcnQgdW5pY29kZSgnaGVsbG8nLCdhc2NpaScpID09IHUnaGVsbG8nCi1hc3NlcnQgdW5pY29kZSgnaGVsbG8nLCd1dGYtOCcpID09IHUnaGVsbG8nCi1hc3NlcnQgdW5pY29kZSgnaGVsbG8nLCd1dGY4JykgPT0gdSdoZWxsbycKLWFzc2VydCB1bmljb2RlKCdoZWxsbycsJ2xhdGluLTEnKSA9PSB1J2hlbGxvJwotCi10cnk6Ci0gICAgdSdBbmRyXDIwMiB4Jy5lbmNvZGUoJ2FzY2lpJykKLSAgICB1J0FuZHJcMjAyIHgnLmVuY29kZSgnYXNjaWknLCdzdHJpY3QnKQotZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgInUnQW5kclwyMDInLmVuY29kZSgnYXNjaWknKSBmYWlsZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIgotYXNzZXJ0IHUnQW5kclwyMDIgeCcuZW5jb2RlKCdhc2NpaScsJ2lnbm9yZScpID09ICJBbmRyIHgiCi1hc3NlcnQgdSdBbmRyXDIwMiB4Jy5lbmNvZGUoJ2FzY2lpJywncmVwbGFjZScpID09ICJBbmRyPyB4IgotCi10cnk6Ci0gICAgdW5pY29kZSgnQW5kclwyMDIgeCcsJ2FzY2lpJykKLSAgICB1bmljb2RlKCdBbmRyXDIwMiB4JywnYXNjaWknLCdzdHJpY3QnKQotZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgInVuaWNvZGUoJ0FuZHJcMjAyJykgZmFpbGVkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiIKLWFzc2VydCB1bmljb2RlKCdBbmRyXDIwMiB4JywnYXNjaWknLCdpZ25vcmUnKSA9PSB1IkFuZHIgeCIKLWFzc2VydCB1bmljb2RlKCdBbmRyXDIwMiB4JywnYXNjaWknLCdyZXBsYWNlJykgPT0gdSdBbmRyXHVGRkZEIHgnCi0KLWFzc2VydCB1J2hlbGxvJy5lbmNvZGUoJ2FzY2lpJykgPT0gJ2hlbGxvJwotYXNzZXJ0IHUnaGVsbG8nLmVuY29kZSgndXRmLTgnKSA9PSAnaGVsbG8nCi1hc3NlcnQgdSdoZWxsbycuZW5jb2RlKCd1dGY4JykgPT0gJ2hlbGxvJwotYXNzZXJ0IHUnaGVsbG8nLmVuY29kZSgndXRmLTE2LWxlJykgPT0gJ2hcMDAwZVwwMDBsXDAwMGxcMDAwb1wwMDAnCi1hc3NlcnQgdSdoZWxsbycuZW5jb2RlKCd1dGYtMTYtYmUnKSA9PSAnXDAwMGhcMDAwZVwwMDBsXDAwMGxcMDAwbycKLWFzc2VydCB1J2hlbGxvJy5lbmNvZGUoJ2xhdGluLTEnKSA9PSAnaGVsbG8nCi0KLXUgPSB1Jycuam9pbihtYXAodW5pY2hyLCByYW5nZSgxMDI0KSkpCi1mb3IgZW5jb2RpbmcgaW4gKCd1dGYtOCcsICd1dGYtMTYnLCAndXRmLTE2LWxlJywgJ3V0Zi0xNi1iZScsCi0gICAgICAgICAgICAgICAgICdyYXdfdW5pY29kZV9lc2NhcGUnLCAndW5pY29kZV9lc2NhcGUnLCAndW5pY29kZV9pbnRlcm5hbCcpOgotICAgIGFzc2VydCB1bmljb2RlKHUuZW5jb2RlKGVuY29kaW5nKSxlbmNvZGluZykgPT0gdQotCi11ID0gdScnLmpvaW4obWFwKHVuaWNociwgcmFuZ2UoMjU2KSkpCi1mb3IgZW5jb2RpbmcgaW4gKAotICAgICdsYXRpbi0xJywKLSAgICApOgotICAgIHRyeToKLSAgICAgICAgYXNzZXJ0IHVuaWNvZGUodS5lbmNvZGUoZW5jb2RpbmcpLGVuY29kaW5nKSA9PSB1Ci0gICAgZXhjZXB0IEFzc2VydGlvbkVycm9yOgotICAgICAgICBwcmludCAnKioqIGNvZGVjICIlcyIgZmFpbGVkIHJvdW5kLXRyaXAnICUgZW5jb2RpbmcKLSAgICBleGNlcHQgVmFsdWVFcnJvcix3aHk6Ci0gICAgICAgIHByaW50ICcqKiogY29kZWMgZm9yICIlcyIgZmFpbGVkOiAlcycgJSAoZW5jb2RpbmcsIHdoeSkKLQotdSA9IHUnJy5qb2luKG1hcCh1bmljaHIsIHJhbmdlKDEyOCkpKQotZm9yIGVuY29kaW5nIGluICgKLSAgICAnYXNjaWknLAotICAgICk6Ci0gICAgdHJ5OgotICAgICAgICBhc3NlcnQgdW5pY29kZSh1LmVuY29kZShlbmNvZGluZyksZW5jb2RpbmcpID09IHUKLSAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3I6Ci0gICAgICAgIHByaW50ICcqKiogY29kZWMgIiVzIiBmYWlsZWQgcm91bmQtdHJpcCcgJSBlbmNvZGluZwotICAgIGV4Y2VwdCBWYWx1ZUVycm9yLHdoeToKLSAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyBmb3IgIiVzIiBmYWlsZWQ6ICVzJyAlIChlbmNvZGluZywgd2h5KQotCi1wcmludCAnZG9uZS4nCi0KLXByaW50ICdUZXN0aW5nIHN0YW5kYXJkIG1hcHBpbmcgY29kZWNzLi4uJywKLQotcHJpbnQgJzAtMTI3Li4uJywKLXMgPSAnJy5qb2luKG1hcChjaHIsIHJhbmdlKDEyOCkpKQotZm9yIGVuY29kaW5nIGluICgKLSAgICAnY3AwMzcnLCAnY3AxMDI2JywKLSAgICAnY3A0MzcnLCAnY3A1MDAnLCAnY3A3MzcnLCAnY3A3NzUnLCAnY3A4NTAnLAotICAgICdjcDg1MicsICdjcDg1NScsICdjcDg2MCcsICdjcDg2MScsICdjcDg2MicsCi0gICAgJ2NwODYzJywgJ2NwODY1JywgJ2NwODY2JywgCi0gICAgJ2lzbzg4NTlfMTAnLCAnaXNvODg1OV8xMycsICdpc284ODU5XzE0JywgJ2lzbzg4NTlfMTUnLAotICAgICdpc284ODU5XzInLCAnaXNvODg1OV8zJywgJ2lzbzg4NTlfNCcsICdpc284ODU5XzUnLCAnaXNvODg1OV82JywKLSAgICAnaXNvODg1OV83JywgJ2lzbzg4NTlfOScsICdrb2k4X3InLCAnbGF0aW5fMScsCi0gICAgJ21hY19jeXJpbGxpYycsICdtYWNfbGF0aW4yJywKLQotICAgICdjcDEyNTAnLCAnY3AxMjUxJywgJ2NwMTI1MicsICdjcDEyNTMnLCAnY3AxMjU0JywgJ2NwMTI1NScsCi0gICAgJ2NwMTI1NicsICdjcDEyNTcnLCAnY3AxMjU4JywKLSAgICAnY3A4NTYnLCAnY3A4NTcnLCAnY3A4NjQnLCAnY3A4NjknLCAnY3A4NzQnLAotCi0gICAgJ21hY19ncmVlaycsICdtYWNfaWNlbGFuZCcsJ21hY19yb21hbicsICdtYWNfdHVya2lzaCcsCi0gICAgJ2NwMTAwNicsICdjcDg3NScsICdpc284ODU5XzgnLAotICAgIAotICAgICMjIyBUaGVzZSBoYXZlIHVuZGVmaW5lZCBtYXBwaW5nczoKLSAgICAjJ2NwNDI0JywKLSAgICAKLSAgICApOgotICAgIHRyeToKLSAgICAgICAgYXNzZXJ0IHVuaWNvZGUocyxlbmNvZGluZykuZW5jb2RlKGVuY29kaW5nKSA9PSBzCi0gICAgZXhjZXB0IEFzc2VydGlvbkVycm9yOgotICAgICAgICBwcmludCAnKioqIGNvZGVjICIlcyIgZmFpbGVkIHJvdW5kLXRyaXAnICUgZW5jb2RpbmcKLSAgICBleGNlcHQgVmFsdWVFcnJvcix3aHk6Ci0gICAgICAgIHByaW50ICcqKiogY29kZWMgZm9yICIlcyIgZmFpbGVkOiAlcycgJSAoZW5jb2RpbmcsIHdoeSkKLQotcHJpbnQgJzEyOC0yNTUuLi4nLAotcyA9ICcnLmpvaW4obWFwKGNociwgcmFuZ2UoMTI4LDI1NikpKQotZm9yIGVuY29kaW5nIGluICgKLSAgICAnY3AwMzcnLCAnY3AxMDI2JywKLSAgICAnY3A0MzcnLCAnY3A1MDAnLCAnY3A3MzcnLCAnY3A3NzUnLCAnY3A4NTAnLAotICAgICdjcDg1MicsICdjcDg1NScsICdjcDg2MCcsICdjcDg2MScsICdjcDg2MicsCi0gICAgJ2NwODYzJywgJ2NwODY1JywgJ2NwODY2JywgCi0gICAgJ2lzbzg4NTlfMTAnLCAnaXNvODg1OV8xMycsICdpc284ODU5XzE0JywgJ2lzbzg4NTlfMTUnLAotICAgICdpc284ODU5XzInLCAnaXNvODg1OV8zJywgJ2lzbzg4NTlfNCcsICdpc284ODU5XzUnLCAnaXNvODg1OV82JywKLSAgICAnaXNvODg1OV83JywgJ2lzbzg4NTlfOScsICdrb2k4X3InLCAnbGF0aW5fMScsCi0gICAgJ21hY19jeXJpbGxpYycsICdtYWNfbGF0aW4yJywKLSAgICAKLSAgICAjIyMgVGhlc2UgaGF2ZSB1bmRlZmluZWQgbWFwcGluZ3M6Ci0gICAgIydjcDEyNTAnLCAnY3AxMjUxJywgJ2NwMTI1MicsICdjcDEyNTMnLCAnY3AxMjU0JywgJ2NwMTI1NScsCi0gICAgIydjcDEyNTYnLCAnY3AxMjU3JywgJ2NwMTI1OCcsCi0gICAgIydjcDQyNCcsICdjcDg1NicsICdjcDg1NycsICdjcDg2NCcsICdjcDg2OScsICdjcDg3NCcsCi0gICAgIydtYWNfZ3JlZWsnLCAnbWFjX2ljZWxhbmQnLCdtYWNfcm9tYW4nLCAnbWFjX3R1cmtpc2gnLAotICAgIAotICAgICMjIyBUaGVzZSBmYWlsIHRoZSByb3VuZC10cmlwOgotICAgICMnY3AxMDA2JywgJ2NwODc1JywgJ2lzbzg4NTlfOCcsCi0gICAgCi0gICAgKToKLSAgICB0cnk6Ci0gICAgICAgIGFzc2VydCB1bmljb2RlKHMsZW5jb2RpbmcpLmVuY29kZShlbmNvZGluZykgPT0gcwotICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvcjoKLSAgICAgICAgcHJpbnQgJyoqKiBjb2RlYyAiJXMiIGZhaWxlZCByb3VuZC10cmlwJyAlIGVuY29kaW5nCi0gICAgZXhjZXB0IFZhbHVlRXJyb3Isd2h5OgotICAgICAgICBwcmludCAnKioqIGNvZGVjIGZvciAiJXMiIGZhaWxlZDogJXMnICUgKGVuY29kaW5nLCB3aHkpCi0KLXByaW50ICdkb25lLicKLQotcHJpbnQgJ1Rlc3RpbmcgVW5pY29kZSBzdHJpbmcgY29uY2F0ZW5hdGlvbi4uLicsCi1hc3NlcnQgKHUiYWJjIiB1ImRlZiIpID09IHUiYWJjZGVmIgotYXNzZXJ0ICgiYWJjIiB1ImRlZiIpID09IHUiYWJjZGVmIgotYXNzZXJ0ICh1ImFiYyIgImRlZiIpID09IHUiYWJjZGVmIgotYXNzZXJ0ICh1ImFiYyIgdSJkZWYiICJnaGkiKSA9PSB1ImFiY2RlZmdoaSIKLWFzc2VydCAoImFiYyIgImRlZiIgdSJnaGkiKSA9PSB1ImFiY2RlZmdoaSIKIHByaW50ICdkb25lLicKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3RfdXNlLnB5IGIvTGliL2Rvcy04eDMvdGVzdF91c2UucHkKaW5kZXggNjM2MzJmNy4uYzEyZjFlMiAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF91c2UucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF91c2UucHkKQEAgLTEsMTAxICsxLDIyNyBAQAotIyBDaGVjayBldmVyeSBwYXRoIHRocm91Z2ggZXZlcnkgbWV0aG9kIG9mIFVzZXJEaWN0CisjIS91c3IvYmluL2VudiBweXRob24KK2ltcG9ydCBzeXMsIHN0cmluZworZnJvbSB0ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UKKyMgVXNlclN0cmluZyBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBuYXRpdmUgYnVpbHRpbiBzdHJpbmcgdHlwZS4KKyMgVXNlclN0cmluZyBpbnN0YW5jZXMgc2hvdWxkIGJlaGF2ZSBzaW1pbGFyIHRvIGJ1aWx0aW4gc3RyaW5nIG9iamVjdHMuCisjIFRoZSB0ZXN0IGNhc2VzIHdlcmUgaW4gcGFydCBkZXJpdmVkIGZyb20gJ3Rlc3Rfc3RyaW5nLnB5Jy4KK2Zyb20gVXNlclN0cmluZyBpbXBvcnQgVXNlclN0cmluZwogCi1mcm9tIFVzZXJEaWN0IGltcG9ydCBVc2VyRGljdAoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB2ZXJib3NlID0gMAogCi1kMCA9IHt9Ci1kMSA9IHsib25lIjogMX0KLWQyID0geyJvbmUiOiAxLCAidHdvIjogMn0KK3Rlc3RlZF9tZXRob2RzID0ge30KIAotIyBUZXN0IGNvbnN0cnVjdG9ycworZGVmIHRlc3QobWV0aG9kbmFtZSwgaW5wdXQsICphcmdzKToKKyAgICBnbG9iYWwgdGVzdGVkX21ldGhvZHMKKyAgICB0ZXN0ZWRfbWV0aG9kc1ttZXRob2RuYW1lXSA9IDEKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnJXMuJXMoJXMpICcgJSAoaW5wdXQsIG1ldGhvZG5hbWUsIGFyZ3MpLAorICAgIHUgPSBVc2VyU3RyaW5nKGlucHV0KQorICAgIG9iamVjdHMgPSBbaW5wdXQsIHUsIFVzZXJTdHJpbmcodSldCisgICAgcmVzID0gWyIiXSAqIDMKKyAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgICAgb2JqZWN0ID0gb2JqZWN0c1tpXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gZ2V0YXR0cihvYmplY3QsIG1ldGhvZG5hbWUpCisgICAgICAgICAgICByZXNbaV0gPSBhcHBseShmLCBhcmdzKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXNbaV0gPSBzeXMuZXhjX3R5cGUKKyAgICBpZiByZXNbMF0gIT0gcmVzWzFdOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ25vJworICAgICAgICBwcmludCBgaW5wdXRgLCBmLCBgcmVzWzBdYCwgIjw+IiwgYHJlc1sxXWAKKyAgICBlbHNlOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ3llcycKKyAgICBpZiByZXNbMV0gIT0gcmVzWzJdOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ25vJworICAgICAgICBwcmludCBgaW5wdXRgLCBmLCBgcmVzWzFdYCwgIjw+IiwgYHJlc1syXWAKKyAgICBlbHNlOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ3llcycKIAotdSA9IFVzZXJEaWN0KCkKLXUwID0gVXNlckRpY3QoZDApCi11MSA9IFVzZXJEaWN0KGQxKQotdTIgPSBVc2VyRGljdChkMikKK3Rlc3QoJ2NhcGl0YWxpemUnLCAnIGhlbGxvICcpCit0ZXN0KCdjYXBpdGFsaXplJywgJ2hlbGxvICcpCiAKLXV1ID0gVXNlckRpY3QodSkKLXV1MCA9IFVzZXJEaWN0KHUwKQotdXUxID0gVXNlckRpY3QodTEpCi11dTIgPSBVc2VyRGljdCh1MikKK3Rlc3QoJ2NlbnRlcicsICdmb28nLCAwKQordGVzdCgnY2VudGVyJywgJ2ZvbycsIDMpCit0ZXN0KCdjZW50ZXInLCAnZm9vJywgMTYpCiAKLSMgVGVzdCBfX3JlcHJfXwordGVzdCgnbGp1c3QnLCAnZm9vJywgMCkKK3Rlc3QoJ2xqdXN0JywgJ2ZvbycsIDMpCit0ZXN0KCdsanVzdCcsICdmb28nLCAxNikKIAotYXNzZXJ0IHN0cih1MCkgPT0gc3RyKGQwKQotYXNzZXJ0IHJlcHIodTEpID09IHJlcHIoZDEpCi1hc3NlcnQgYHUyYCA9PSBgZDJgCit0ZXN0KCdyanVzdCcsICdmb28nLCAwKQordGVzdCgncmp1c3QnLCAnZm9vJywgMykKK3Rlc3QoJ3JqdXN0JywgJ2ZvbycsIDE2KQogCi0jIFRlc3QgX19jbXBfXyBhbmQgX19sZW5fXwordGVzdCgnY291bnQnLCAnYWJjYWJjYWJjJywgJ2FiYycpCit0ZXN0KCdjb3VudCcsICdhYmNhYmNhYmMnLCAnYWJjJywgMSkKK3Rlc3QoJ2NvdW50JywgJ2FiY2FiY2FiYycsICdhYmMnLCAtMSkKK3Rlc3QoJ2NvdW50JywgJ2FiY2FiY2FiYycsICdhYmMnLCA3KQordGVzdCgnY291bnQnLCAnYWJjYWJjYWJjJywgJ2FiYycsIDAsIDMpCit0ZXN0KCdjb3VudCcsICdhYmNhYmNhYmMnLCAnYWJjJywgMCwgMzMzKQogCi1hbGwgPSBbZDAsIGQxLCBkMiwgdSwgdTAsIHUxLCB1MiwgdXUsIHV1MCwgdXUxLCB1dTJdCi1mb3IgYSBpbiBhbGw6Ci0gICAgZm9yIGIgaW4gYWxsOgotICAgICAgICBhc3NlcnQgY21wKGEsIGIpID09IGNtcChsZW4oYSksIGxlbihiKSkKK3Rlc3QoJ2ZpbmQnLCAnYWJjZGVmZ2hpYWJjJywgJ2FiYycpCit0ZXN0KCdmaW5kJywgJ2FiY2RlZmdoaWFiYycsICdhYmMnLCAxKQordGVzdCgnZmluZCcsICdhYmNkZWZnaGlhYmMnLCAnZGVmJywgNCkKK3Rlc3QoJ3JmaW5kJywgJ2FiY2RlZmdoaWFiYycsICdhYmMnKQogCi0jIFRlc3QgX19nZXRpdGVtX18KK3Rlc3QoJ2luZGV4JywgJ2FiY2FiY2FiYycsICdhYmMnKQordGVzdCgnaW5kZXgnLCAnYWJjYWJjYWJjJywgJ2FiYycsIDEpCit0ZXN0KCdpbmRleCcsICdhYmNhYmNhYmMnLCAnYWJjJywgLTEpCit0ZXN0KCdpbmRleCcsICdhYmNhYmNhYmMnLCAnYWJjJywgNykKK3Rlc3QoJ2luZGV4JywgJ2FiY2FiY2FiYycsICdhYmMnLCAwLCAzKQordGVzdCgnaW5kZXgnLCAnYWJjYWJjYWJjJywgJ2FiYycsIDAsIDMzMykKIAotYXNzZXJ0IHUyWyJvbmUiXSA9PSAxCi10cnk6Ci0gICAgdTFbInR3byJdCi1leGNlcHQgS2V5RXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICBhc3NlcnQgMCwgInUxWyd0d28nXSBzaG91bGRuJ3QgZXhpc3QiCit0ZXN0KCdyaW5kZXgnLCAnYWJjYWJjYWJjJywgJ2FiYycpCit0ZXN0KCdyaW5kZXgnLCAnYWJjYWJjYWJjJywgJ2FiYycsIDEpCit0ZXN0KCdyaW5kZXgnLCAnYWJjYWJjYWJjJywgJ2FiYycsIC0xKQordGVzdCgncmluZGV4JywgJ2FiY2FiY2FiYycsICdhYmMnLCA3KQordGVzdCgncmluZGV4JywgJ2FiY2FiY2FiYycsICdhYmMnLCAwLCAzKQordGVzdCgncmluZGV4JywgJ2FiY2FiY2FiYycsICdhYmMnLCAwLCAzMzMpCiAKLSMgVGVzdCBfX3NldGl0ZW1fXwogCi11MyA9IFVzZXJEaWN0KHUyKQotdTNbInR3byJdID0gMgotdTNbInRocmVlIl0gPSAzCit0ZXN0KCdsb3dlcicsICdIZUxMbycpCit0ZXN0KCdsb3dlcicsICdoZWxsbycpCit0ZXN0KCd1cHBlcicsICdIZUxMbycpCit0ZXN0KCd1cHBlcicsICdIRUxMTycpCiAKLSMgVGVzdCBfX2RlbGl0ZW1fXwordGVzdCgndGl0bGUnLCAnIGhlbGxvICcpCit0ZXN0KCd0aXRsZScsICdoZWxsbyAnKQordGVzdCgndGl0bGUnLCAiZk9yTWFUIHRoSXMgYVMgdGl0TGUgU3RyaW5nIikKK3Rlc3QoJ3RpdGxlJywgImZPck1hVCx0aElzLWFTKnRpdExlO1N0cmluZyIpCit0ZXN0KCd0aXRsZScsICJnZXRJbnQiKQogCi1kZWwgdTNbInRocmVlIl0KLXRyeToKLSAgICBkZWwgdTNbInRocmVlIl0KLWV4Y2VwdCBLZXlFcnJvcjoKLSAgICBwYXNzCi1lbHNlOgotICAgIGFzc2VydCAwLCAidTNbJ3RocmVlJ10gc2hvdWxkbid0IGV4aXN0IgordGVzdCgnZXhwYW5kdGFicycsICdhYmNccmFiXHRkZWZcbmdcdGhpJykKK3Rlc3QoJ2V4cGFuZHRhYnMnLCAnYWJjXHJhYlx0ZGVmXG5nXHRoaScsIDgpCit0ZXN0KCdleHBhbmR0YWJzJywgJ2FiY1xyYWJcdGRlZlxuZ1x0aGknLCA0KQordGVzdCgnZXhwYW5kdGFicycsICdhYmNcclxuYWJcdGRlZlxuZ1x0aGknLCA0KQogCi0jIFRlc3QgY2xlYXIKK3Rlc3QoJ2lzbG93ZXInLCAnYScpCit0ZXN0KCdpc2xvd2VyJywgJ0EnKQordGVzdCgnaXNsb3dlcicsICdcbicpCit0ZXN0KCdpc2xvd2VyJywgJ2FiYycpCit0ZXN0KCdpc2xvd2VyJywgJ2FCYycpCit0ZXN0KCdpc2xvd2VyJywgJ2FiY1xuJykKIAotdTMuY2xlYXIoKQotYXNzZXJ0IHUzID09IHt9Cit0ZXN0KCdpc3VwcGVyJywgJ2EnKQordGVzdCgnaXN1cHBlcicsICdBJykKK3Rlc3QoJ2lzdXBwZXInLCAnXG4nKQordGVzdCgnaXN1cHBlcicsICdBQkMnKQordGVzdCgnaXN1cHBlcicsICdBYkMnKQordGVzdCgnaXN1cHBlcicsICdBQkNcbicpCiAKLSMgVGVzdCBjb3B5KCkKK3Rlc3QoJ2lzZGlnaXQnLCAnICAwMTIzNDU2Nzg5JykKK3Rlc3QoJ2lzZGlnaXQnLCAnNTY3ODknKQordGVzdCgnaXNkaWdpdCcsICc1NjcuODknKQordGVzdCgnaXNkaWdpdCcsICcwMTIzNDU2Nzg5YWJjJykKIAotdTJhID0gdTIuY29weSgpCi1hc3NlcnQgdTJhID09IHUyCit0ZXN0KCdpc3NwYWNlJywgJycpCit0ZXN0KCdpc3NwYWNlJywgJyAnKQordGVzdCgnaXNzcGFjZScsICcgXHQnKQordGVzdCgnaXNzcGFjZScsICcgXHRcZlxuJykKIAotY2xhc3MgTXlVc2VyRGljdChVc2VyRGljdCk6Ci0gICAgZGVmIGRpc3BsYXkoc2VsZik6IHByaW50IHNlbGYKK3Rlc3QoJ2lzdGl0bGUnLCAnYScpCit0ZXN0KCdpc3RpdGxlJywgJ0EnKQordGVzdCgnaXN0aXRsZScsICdcbicpCit0ZXN0KCdpc3RpdGxlJywgJ0EgVGl0bGVjYXNlZCBMaW5lJykKK3Rlc3QoJ2lzdGl0bGUnLCAnQVxuVGl0bGVjYXNlZCBMaW5lJykKK3Rlc3QoJ2lzdGl0bGUnLCAnQSBUaXRsZWNhc2VkLCBMaW5lJykKK3Rlc3QoJ2lzdGl0bGUnLCAnTm90IGEgY2FwaXRhbGl6ZWQgU3RyaW5nJykKK3Rlc3QoJ2lzdGl0bGUnLCAnTm90XHRhIFRpdGxlY2FzZSBTdHJpbmcnKQordGVzdCgnaXN0aXRsZScsICdOb3QtLWEgVGl0bGVjYXNlIFN0cmluZycpCiAKLW0yID0gTXlVc2VyRGljdCh1MikKLW0yYSA9IG0yLmNvcHkoKQotYXNzZXJ0IG0yYSA9PSBtMgordGVzdCgnc3BsaXRsaW5lcycsICJhYmNcbmRlZlxuXHJnaGkiKQordGVzdCgnc3BsaXRsaW5lcycsICJhYmNcbmRlZlxuXHJcbmdoaSIpCit0ZXN0KCdzcGxpdGxpbmVzJywgImFiY1xuZGVmXHJcbmdoaSIpCit0ZXN0KCdzcGxpdGxpbmVzJywgImFiY1xuZGVmXHJcbmdoaVxuIikKK3Rlc3QoJ3NwbGl0bGluZXMnLCAiYWJjXG5kZWZcclxuZ2hpXG5cciIpCit0ZXN0KCdzcGxpdGxpbmVzJywgIlxuYWJjXG5kZWZcclxuZ2hpXG5cciIpCit0ZXN0KCdzcGxpdGxpbmVzJywgIlxuYWJjXG5kZWZcclxuZ2hpXG5cciIpCit0ZXN0KCdzcGxpdGxpbmVzJywgIlxuYWJjXG5kZWZcclxuZ2hpXG5cciIpCiAKLSMgVGVzdCBrZXlzLCBpdGVtcywgdmFsdWVzCit0ZXN0KCdzcGxpdCcsICd0aGlzIGlzIHRoZSBzcGxpdCBmdW5jdGlvbicpCit0ZXN0KCdzcGxpdCcsICdhfGJ8Y3xkJywgJ3wnKQordGVzdCgnc3BsaXQnLCAnYXxifGN8ZCcsICd8JywgMikKK3Rlc3QoJ3NwbGl0JywgJ2EgYiBjIGQnLCBOb25lLCAxKQordGVzdCgnc3BsaXQnLCAnYSBiIGMgZCcsIE5vbmUsIDIpCit0ZXN0KCdzcGxpdCcsICdhIGIgYyBkJywgTm9uZSwgMykKK3Rlc3QoJ3NwbGl0JywgJ2EgYiBjIGQnLCBOb25lLCA0KQordGVzdCgnc3BsaXQnLCAnYSBiIGMgZCcsIE5vbmUsIDApCit0ZXN0KCdzcGxpdCcsICdhICBiICBjICBkJywgTm9uZSwgMikKK3Rlc3QoJ3NwbGl0JywgJ2EgYiBjIGQgJykKIAotYXNzZXJ0IHUyLmtleXMoKSA9PSBkMi5rZXlzKCkKLWFzc2VydCB1Mi5pdGVtcygpID09IGQyLml0ZW1zKCkKLWFzc2VydCB1Mi52YWx1ZXMoKSA9PSBkMi52YWx1ZXMoKQorIyBqb2luIG5vdyB3b3JrcyB3aXRoIGFueSBzZXF1ZW5jZSB0eXBlCitjbGFzcyBTZXF1ZW5jZToKKyAgICBkZWYgX19pbml0X18oc2VsZik6IHNlbGYuc2VxID0gJ3d4eXonCisgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiBsZW4oc2VsZi5zZXEpCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOiByZXR1cm4gc2VsZi5zZXFbaV0KIAotIyBUZXN0IGhhc19rZXkKK3Rlc3QoJ2pvaW4nLCAnJywgKCdhJywgJ2InLCAnYycsICdkJykpCit0ZXN0KCdqb2luJywgJycsIFNlcXVlbmNlKCkpCit0ZXN0KCdqb2luJywgJycsIDcpCiAKLWZvciBpIGluIHUyLmtleXMoKToKLSAgICBhc3NlcnQgdTIuaGFzX2tleShpKSA9PSAxCi0gICAgYXNzZXJ0IHUxLmhhc19rZXkoaSkgPT0gZDEuaGFzX2tleShpKQotICAgIGFzc2VydCB1MC5oYXNfa2V5KGkpID09IGQwLmhhc19rZXkoaSkKK2NsYXNzIEJhZFNlcShTZXF1ZW5jZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOiBzZWxmLnNlcSA9IFs3LCAnaGVsbG8nLCAxMjNMXQogCi0jIFRlc3QgdXBkYXRlCit0ZXN0KCdqb2luJywgJycsIEJhZFNlcSgpKQogCi10ID0gVXNlckRpY3QoKQotdC51cGRhdGUodTIpCi1hc3NlcnQgdCA9PSB1MgordGVzdCgnc3RyaXAnLCAnICAgaGVsbG8gICAnKQordGVzdCgnbHN0cmlwJywgJyAgIGhlbGxvICAgJykKK3Rlc3QoJ3JzdHJpcCcsICcgICBoZWxsbyAgICcpCit0ZXN0KCdzdHJpcCcsICdoZWxsbycpCiAKLSMgVGVzdCBnZXQKK3Rlc3QoJ3N3YXBjYXNlJywgJ0hlTExvIGNPbXBVdGVScycpCit0cmFuc3RhYmxlID0gc3RyaW5nLm1ha2V0cmFucygiYWJjIiwgInh5eiIpCit0ZXN0KCd0cmFuc2xhdGUnLCAneHl6YWJjZGVmJywgdHJhbnN0YWJsZSwgJ2RlZicpCiAKLWZvciBpIGluIHUyLmtleXMoKToKLSAgICBhc3NlcnQgdTIuZ2V0KGkpID09IHUyW2ldCi0gICAgYXNzZXJ0IHUxLmdldChpKSA9PSBkMS5nZXQoaSkKLSAgICBhc3NlcnQgdTAuZ2V0KGkpID09IGQwLmdldChpKQordHJhbnN0YWJsZSA9IHN0cmluZy5tYWtldHJhbnMoJ2EnLCAnQScpCit0ZXN0KCd0cmFuc2xhdGUnLCAnYWJjJywgdHJhbnN0YWJsZSkKK3Rlc3QoJ3RyYW5zbGF0ZScsICd4eXonLCB0cmFuc3RhYmxlKQorCit0ZXN0KCdyZXBsYWNlJywgJ29uZSF0d28hdGhyZWUhJywgJyEnLCAnQCcsIDEpCit0ZXN0KCdyZXBsYWNlJywgJ29uZSF0d28hdGhyZWUhJywgJyEnLCAnJykKK3Rlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAnIScsICdAJywgMikKK3Rlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAnIScsICdAJywgMykKK3Rlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAnIScsICdAJywgNCkKK3Rlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAnIScsICdAJywgMCkKK3Rlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAnIScsICdAJykKK3Rlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAneCcsICdAJykKK3Rlc3QoJ3JlcGxhY2UnLCAnb25lIXR3byF0aHJlZSEnLCAneCcsICdAJywgMikKKwordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsICdoZScpCit0ZXN0KCdzdGFydHN3aXRoJywgJ2hlbGxvJywgJ2hlbGxvJykKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAnaGVsbG8gd29ybGQnKQordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsICcnKQordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsICdlbGxvJykKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAnZWxsbycsIDEpCit0ZXN0KCdzdGFydHN3aXRoJywgJ2hlbGxvJywgJ28nLCA0KQordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsbycsICdvJywgNSkKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAnJywgNSkKK3Rlc3QoJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAnbG8nLCA2KQordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsb3dvcmxkJywgJ2xvd28nLCAzKQordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsb3dvcmxkJywgJ2xvd28nLCAzLCA3KQordGVzdCgnc3RhcnRzd2l0aCcsICdoZWxsb3dvcmxkJywgJ2xvd28nLCAzLCA2KQorCit0ZXN0KCdlbmRzd2l0aCcsICdoZWxsbycsICdsbycpCit0ZXN0KCdlbmRzd2l0aCcsICdoZWxsbycsICdoZScpCit0ZXN0KCdlbmRzd2l0aCcsICdoZWxsbycsICcnKQordGVzdCgnZW5kc3dpdGgnLCAnaGVsbG8nLCAnaGVsbG8gd29ybGQnKQordGVzdCgnZW5kc3dpdGgnLCAnaGVsbG93b3JsZCcsICd3b3JsJykKK3Rlc3QoJ2VuZHN3aXRoJywgJ2hlbGxvd29ybGQnLCAnd29ybCcsIDMsIDkpCit0ZXN0KCdlbmRzd2l0aCcsICdoZWxsb3dvcmxkJywgJ3dvcmxkJywgMywgMTIpCit0ZXN0KCdlbmRzd2l0aCcsICdoZWxsb3dvcmxkJywgJ2xvd28nLCAxLCA3KQordGVzdCgnZW5kc3dpdGgnLCAnaGVsbG93b3JsZCcsICdsb3dvJywgMiwgNykKK3Rlc3QoJ2VuZHN3aXRoJywgJ2hlbGxvd29ybGQnLCAnbG93bycsIDMsIDcpCit0ZXN0KCdlbmRzd2l0aCcsICdoZWxsb3dvcmxkJywgJ2xvd28nLCA0LCA3KQordGVzdCgnZW5kc3dpdGgnLCAnaGVsbG93b3JsZCcsICdsb3dvJywgMywgOCkKK3Rlc3QoJ2VuZHN3aXRoJywgJ2FiJywgJ2FiJywgMCwgMSkKK3Rlc3QoJ2VuZHN3aXRoJywgJ2FiJywgJ2FiJywgMCwgMCkKKworIyBUT0RPOiB0ZXN0IGNhc2VzIGZvcjogaW50LCBsb25nLCBmbG9hdCwgY29tcGxleCwgKywgKiBhbmQgY21wCitzID0gIiIKK2ZvciBidWlsdGluX21ldGhvZCBpbiBkaXIocyk6CisgICAgaWYgbm90IHRlc3RlZF9tZXRob2RzLmhhc19rZXkoYnVpbHRpbl9tZXRob2QpOgorICAgICAgICBwcmludCAibm8gcmVncmVzc2lvbiB0ZXN0IGNhc2UgZm9yIG1ldGhvZCAnIitidWlsdGluX21ldGhvZCsiJyIKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3Rfd2luLnB5IGIvTGliL2Rvcy04eDMvdGVzdF93aW4ucHkKaW5kZXggNWViMjk4Ni4uN2I0ZmExNSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF93aW4ucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF93aW4ucHkKQEAgLTEsMTQ3ICsxLDcgQEAKLSMgVGVzdCB0aGUgd2luZG93cyBzcGVjaWZpYyB3aW4zMnJlZyBtb2R1bGUuCi0jIE9ubHkgd2luMzJyZWcgZnVuY3Rpb25zIG5vdCBoaXQgaGVyZTogRmx1c2hLZXksIExvYWRLZXkgYW5kIFNhdmVLZXkKKyMgUmlkaWN1bG91c2x5IHNpbXBsZSB0ZXN0IG9mIHRoZSB3aW5zb3VuZCBtb2R1bGUgZm9yIFdpbmRvd3MuCiAKLWZyb20gd2lucmVnIGltcG9ydCAqCi1pbXBvcnQgb3MsIHN5cwotCi10ZXN0X2tleV9uYW1lID0gIlNPRlRXQVJFXFxQeXRob24gUmVnaXN0cnkgVGVzdCBLZXkgLSBEZWxldGUgTWUiCi0KLXRlc3RfZGF0YSA9IFsKLSAgICAoIkludCBWYWx1ZSIsICAgICA0NSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19EV09SRCksCi0gICAgKCJTdHJpbmcgVmFsIiwgICAgIkEgc3RyaW5nIHZhbHVlIiwgICAgICAgICAgICAgICAgICAgICAgICBSRUdfU1osKSwKLSAgICAodSJVbmljb2RlIFZhbCIsICB1IkEgVW5pY29kZSB2YWx1ZSIsICAgICAgICAgICAgICAgICAgICAgIFJFR19TWiwpLAotICAgICgiU3RyaW5nRXhwYW5kIiwgICJUaGUgcGF0aCBpcyAlcGF0aCUiLCAgICAgICAgICAgICAgICAgICAgUkVHX0VYUEFORF9TWiksCi0gICAgKCJVbmljb2RlRXhwYW5kIiwgdSJUaGUgcGF0aCBpcyAlcGF0aCUiLCAgICAgICAgICAgICAgICAgICBSRUdfRVhQQU5EX1NaKSwKLSAgICAoIk11bHRpLXN0cmluZyIsICBbIkxvdHMiLCAib2YiLCAic3RyaW5nIiwgInZhbHVlcyJdLCAgICAgIFJFR19NVUxUSV9TWiksCi0gICAgKCJNdWx0aS11bmljb2RlIiwgW3UiTG90cyIsIHUib2YiLCB1InVuaWNvZGUiLCB1InZhbHVlcyJdLCBSRUdfTVVMVElfU1opLAotICAgICgiTXVsdGktbWl4ZWQiLCAgIFt1IlVuaWNvZGUiLCB1ImFuZCIsICJzdHJpbmciLCAidmFsdWVzIl0sUkVHX01VTFRJX1NaKSwKLSAgICAoIlJhdyBEYXRhIiwgICAgICAoImJpbmFyeSIrY2hyKDApKyJkYXRhIiksICAgICAgICAgICAgICAgIFJFR19CSU5BUlkpLAotXQotCi1kZWYgV3JpdGVUZXN0RGF0YShyb290X2tleSk6Ci0gICAgIyBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMga2V5LgotICAgIFNldFZhbHVlKHJvb3Rfa2V5LCB0ZXN0X2tleV9uYW1lLCBSRUdfU1osICJEZWZhdWx0IHZhbHVlIikKLSAgICBrZXkgPSBDcmVhdGVLZXkocm9vdF9rZXksIHRlc3Rfa2V5X25hbWUpCi0gICAgIyBDcmVhdGUgYSBzdWIta2V5Ci0gICAgc3ViX2tleSA9IENyZWF0ZUtleShrZXksICJzdWJfa2V5IikKLSAgICAjIEdpdmUgdGhlIHN1Yi1rZXkgc29tZSBuYW1lZCB2YWx1ZXMKLQotICAgIGZvciB2YWx1ZV9uYW1lLCB2YWx1ZV9kYXRhLCB2YWx1ZV90eXBlIGluIHRlc3RfZGF0YToKLSAgICAgICAgU2V0VmFsdWVFeChzdWJfa2V5LCB2YWx1ZV9uYW1lLCAwLCB2YWx1ZV90eXBlLCB2YWx1ZV9kYXRhKQotCi0gICAgIyBDaGVjayB3ZSB3cm90ZSBhcyBtYW55IGl0ZW1zIGFzIHdlIHRob3VnaHQuCi0gICAgbmtleXMsIG52YWx1ZXMsIHNpbmNlX21vZCA9IFF1ZXJ5SW5mb0tleShrZXkpCi0gICAgYXNzZXJ0IG5rZXlzPT0xLCAiTm90IHRoZSBjb3JyZWN0IG51bWJlciBvZiBzdWIga2V5cyIKLSAgICBhc3NlcnQgbnZhbHVlcz09MSwgIk5vdCB0aGUgY29ycmVjdCBudW1iZXIgb2YgdmFsdWVzIgotICAgIG5rZXlzLCBudmFsdWVzLCBzaW5jZV9tb2QgPSBRdWVyeUluZm9LZXkoc3ViX2tleSkKLSAgICBhc3NlcnQgbmtleXM9PTAsICJOb3QgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHN1YiBrZXlzIgotICAgIGFzc2VydCBudmFsdWVzPT1sZW4odGVzdF9kYXRhKSwgIk5vdCB0aGUgY29ycmVjdCBudW1iZXIgb2YgdmFsdWVzIgotICAgICMgQ2xvc2UgdGhpcyBrZXkgdGhpcyB3YXkuLi4KLSAgICAjIChidXQgYmVmb3JlIHdlIGRvLCBjb3B5IHRoZSBrZXkgYXMgYW4gaW50ZWdlciAtIHRoaXMgYWxsb3dzCi0gICAgIyB1cyB0byB0ZXN0IHRoYXQgdGhlIGtleSByZWFsbHkgZ2V0cyBjbG9zZWQpLgotICAgIGludF9zdWJfa2V5ID0gaW50KHN1Yl9rZXkpCi0gICAgQ2xvc2VLZXkoc3ViX2tleSkKLSAgICB0cnk6Ci0gICAgCVF1ZXJ5SW5mb0tleShpbnRfc3ViX2tleSkKLSAgICAJcmFpc2UgUnVudGltZUVycm9yLCAiSXQgYXBwZWFycyB0aGUgQ2xvc2VLZXkoKSBmdW5jdGlvbiBkb2VzIG5vdCBjbG9zZSB0aGUgYWN0dWFsIGtleSEiCi0gICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6Ci0gICAgCXBhc3MKLSAgICAjIC4uLiBhbmQgY2xvc2UgdGhhdCBrZXkgdGhhdCB3YXkgOi0pCi0gICAgaW50X2tleSA9IGludChrZXkpCi0gICAga2V5LkNsb3NlKCkKLSAgICB0cnk6Ci0gICAgCVF1ZXJ5SW5mb0tleShpbnRfa2V5KQotICAgIAlyYWlzZSBSdW50aW1lRXJyb3IsICJJdCBhcHBlYXJzIHRoZSBrZXkuQ2xvc2UoKSBmdW5jdGlvbiBkb2VzIG5vdCBjbG9zZSB0aGUgYWN0dWFsIGtleSEiCi0gICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6Ci0gICAgCXBhc3MKLQotZGVmIFJlYWRUZXN0RGF0YShyb290X2tleSk6Ci0gICAgIyBDaGVjayB3ZSBjYW4gZ2V0IGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMga2V5LgotICAgIHZhbCA9IFF1ZXJ5VmFsdWUocm9vdF9rZXksIHRlc3Rfa2V5X25hbWUpCi0gICAgYXNzZXJ0IHZhbD09IkRlZmF1bHQgdmFsdWUiLCAiUmVnaXN0cnkgZGlkbnQgZ2l2ZSBiYWNrIHRoZSBjb3JyZWN0IHZhbHVlIgotCi0gICAga2V5ID0gT3BlbktleShyb290X2tleSwgdGVzdF9rZXlfbmFtZSkKLSAgICAjIFJlYWQgdGhlIHN1Yi1rZXlzCi0gICAgc3ViX2tleSA9IE9wZW5LZXkoa2V5LCAic3ViX2tleSIpCi0gICAgIyBDaGVjayBJIGNhbiBlbnVtZXJhdGUgb3ZlciB0aGUgdmFsdWVzLgotICAgIGluZGV4ID0gMAotICAgIHdoaWxlIDE6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGRhdGEgPSBFbnVtVmFsdWUoc3ViX2tleSwgaW5kZXgpCi0gICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgYXNzZXJ0IGRhdGEgaW4gdGVzdF9kYXRhLCAiZGlkbnQgcmVhZCBiYWNrIHRoZSBjb3JyZWN0IHRlc3QgZGF0YS4iCi0gICAgICAgIGluZGV4ID0gaW5kZXggKyAxCi0gICAgYXNzZXJ0IGluZGV4PT1sZW4odGVzdF9kYXRhKSwgIkRpZG50IHJlYWQgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zIgotICAgICMgQ2hlY2sgSSBjYW4gZGlyZWN0bHkgYWNjZXNzIGVhY2ggaXRlbQotICAgIGZvciB2YWx1ZV9uYW1lLCB2YWx1ZV9kYXRhLCB2YWx1ZV90eXBlIGluIHRlc3RfZGF0YToKLSAgICAgICAgcmVhZF92YWwsIHJlYWRfdHlwID0gUXVlcnlWYWx1ZUV4KHN1Yl9rZXksIHZhbHVlX25hbWUpCi0gICAgICAgIGFzc2VydCByZWFkX3ZhbD09dmFsdWVfZGF0YSBhbmQgcmVhZF90eXAgPT0gdmFsdWVfdHlwZSwgXAotICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkaXJlY3RseSByZWFkIHRoZSB2YWx1ZSIKLSAgICBzdWJfa2V5LkNsb3NlKCkKLSAgICAjIEVudW1lcmF0ZSBvdXIgbWFpbiBrZXkuCi0gICAgcmVhZF92YWwgPSBFbnVtS2V5KGtleSwgMCkKLSAgICBhc3NlcnQgcmVhZF92YWwgPT0gInN1Yl9rZXkiLCAiUmVhZCBzdWJrZXkgdmFsdWUgd3JvbmciCi0gICAgdHJ5OgotICAgICAgICBFbnVtS2V5KGtleSwgMSkKLSAgICAgICAgYXNzZXJ0IDAsICJXYXMgYWJsZSB0byBnZXQgYSBzZWNvbmQga2V5IHdoZW4gSSBvbmx5IGhhdmUgb25lISIKLSAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKLSAgICAgICAgcGFzcwotCi0gICAga2V5LkNsb3NlKCkKLQotZGVmIERlbGV0ZVRlc3REYXRhKHJvb3Rfa2V5KToKLSAgICBrZXkgPSBPcGVuS2V5KHJvb3Rfa2V5LCB0ZXN0X2tleV9uYW1lLCAwLCBLRVlfQUxMX0FDQ0VTUykKLSAgICBzdWJfa2V5ID0gT3BlbktleShrZXksICJzdWJfa2V5IiwgMCwgS0VZX0FMTF9BQ0NFU1MpCi0gICAgIyBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRlbGV0ZSB0aGUgdmFsdWVzIGJlZm9yZSBkZWxldGluZwotICAgICMgdGhlIGtleSAoYWx0aG91Z2ggc3Via2V5cyBtdXN0IG5vdCBleGlzdCkuICBXZSBkZWxldGUgdGhlbQotICAgICMgbWFudWFsbHkganVzdCB0byBwcm92ZSB3ZSBjYW4gOi0pCi0gICAgZm9yIHZhbHVlX25hbWUsIHZhbHVlX2RhdGEsIHZhbHVlX3R5cGUgaW4gdGVzdF9kYXRhOgotICAgICAgICBEZWxldGVWYWx1ZShzdWJfa2V5LCB2YWx1ZV9uYW1lKQotCi0gICAgbmtleXMsIG52YWx1ZXMsIHNpbmNlX21vZCA9IFF1ZXJ5SW5mb0tleShzdWJfa2V5KQotICAgIGFzc2VydCBua2V5cz09MCBhbmQgbnZhbHVlcz09MCwgInN1YmtleSBub3QgZW1wdHkgYmVmb3JlIGRlbGV0ZSIKLSAgICBzdWJfa2V5LkNsb3NlKCkKLSAgICBEZWxldGVLZXkoa2V5LCAic3ViX2tleSIpCi0KLSAgICB0cnk6Ci0gICAgICAgICMgU2hvdWxkbnQgYmUgYWJsZSB0byBkZWxldGUgaXQgdHdpY2UhCi0gICAgICAgIERlbGV0ZUtleShrZXksICJzdWJfa2V5IikKLSAgICAgICAgYXNzZXJ0IDAsICJEZWxldGluZyB0aGUga2V5IHR3aWNlIHN1Y2NlZWRlZCIKLSAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGtleS5DbG9zZSgpCi0gICAgRGVsZXRlS2V5KHJvb3Rfa2V5LCB0ZXN0X2tleV9uYW1lKQotICAgICMgT3BlbmluZyBzaG91bGQgbm93IGZhaWwhCi0gICAgdHJ5OgotICAgICAgICBrZXkgPSBPcGVuS2V5KHJvb3Rfa2V5LCB0ZXN0X2tleV9uYW1lKQotICAgICAgICBhc3NlcnQgMCwgIkNvdWxkIG9wZW4gdGhlIG5vbi1leGlzdGVudCBrZXkiCi0gICAgZXhjZXB0IFdpbmRvd3NFcnJvcjogIyBVc2UgdGhpcyBlcnJvciBuYW1lIHRoaXMgdGltZQotICAgICAgICBwYXNzCi0KLWRlZiBUZXN0QWxsKHJvb3Rfa2V5KToKLSAgICBXcml0ZVRlc3REYXRhKHJvb3Rfa2V5KQotICAgIFJlYWRUZXN0RGF0YShyb290X2tleSkKLSAgICBEZWxldGVUZXN0RGF0YShyb290X2tleSkKLQotIyBUZXN0IG9uIG15IGxvY2FsIG1hY2hpbmUuCi1UZXN0QWxsKEhLRVlfQ1VSUkVOVF9VU0VSKQotcHJpbnQgIkxvY2FsIHJlZ2lzdHJ5IHRlc3RzIHdvcmtlZCIKLXRyeToKLSAgICByZW1vdGVfbmFtZSA9IHN5cy5hcmd2W3N5cy5hcmd2LmluZGV4KCItLXJlbW90ZSIpKzFdCi1leGNlcHQgKEluZGV4RXJyb3IsIFZhbHVlRXJyb3IpOgotICAgIHJlbW90ZV9uYW1lID0gTm9uZQotCi1pZiByZW1vdGVfbmFtZSBpcyBub3QgTm9uZToKLSAgICB0cnk6Ci0gICAgICAgIHJlbW90ZV9rZXkgPSBDb25uZWN0UmVnaXN0cnkocmVtb3RlX25hbWUsIEhLRVlfQ1VSUkVOVF9VU0VSKQotICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBleGM6Ci0gICAgICAgIHByaW50ICJDb3VsZCBub3QgY29ubmVjdCB0byB0aGUgcmVtb3RlIG1hY2hpbmUgLSIsIGV4Yy5zdHJlcnJvcgotICAgICAgICByZW1vdGVfa2V5ID0gTm9uZQotICAgIGlmIHJlbW90ZV9rZXkgaXMgbm90IE5vbmU6Ci0gICAgICAgIFRlc3RBbGwocmVtb3RlX2tleSkKLSAgICAgICAgcHJpbnQgIlJlbW90ZSByZWdpc3RyeSB0ZXN0cyB3b3JrZWQiCi1lbHNlOgotICAgIHByaW50ICJSZW1vdGUgcmVnaXN0cnkgY2FsbHMgY2FuIGJlIHRlc3RlZCB1c2luZyIsCi0gICAgcHJpbnQgIid0ZXN0X3dpbnJlZy5weSAtLXJlbW90ZSBcXFxcbWFjaGluZV9uYW1lJyIKK2ltcG9ydCB3aW5zb3VuZAorZm9yIGkgaW4gcmFuZ2UoMTAwLCAyMDAwLCAxMDApOgorICAgIHdpbnNvdW5kLkJlZXAoaSwgNzUpCitwcmludCAiSG9wZWZ1bGx5IHlvdSBoZWFyZCBzb21lIHNvdW5kcyBpbmNyZWFzaW5nIGluIGZyZXF1ZW5jeSEiCiAKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3Rlc3RfemxpLnB5IGIvTGliL2Rvcy04eDMvdGVzdF96bGkucHkKaW5kZXggY2NmYmM3ZC4uZDIyYTJjYyAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGVzdF96bGkucHkKKysrIGIvTGliL2Rvcy04eDMvdGVzdF96bGkucHkKQEAgLTExLDcgKzExLDcgQEAKIGJ1ZiA9IGZpbGUucmVhZCgpICogOAogZmlsZS5jbG9zZSgpCiAKLSMgdGVzdCB0aGUgY2h1Y2tzdW1zIChoZXggc28gdGhlIHRlc3QgZG9lc24ndCBicmVhayBvbiA2NC1iaXQgbWFjaGluZXMpCisjIHRlc3QgdGhlIGNoZWNrc3VtcyAoaGV4IHNvIHRoZSB0ZXN0IGRvZXNuJ3QgYnJlYWsgb24gNjQtYml0IG1hY2hpbmVzKQogcHJpbnQgaGV4KHpsaWIuY3JjMzIoJ3Blbmd1aW4nKSksIGhleCh6bGliLmNyYzMyKCdwZW5ndWluJywgMSkpCiBwcmludCBoZXgoemxpYi5hZGxlcjMyKCdwZW5ndWluJykpLCBoZXgoemxpYi5hZGxlcjMyKCdwZW5ndWluJywgMSkpCiAKZGlmZiAtLWdpdCBhL0xpYi9kb3MtOHgzL3RocmVhZGluLnB5IGIvTGliL2Rvcy04eDMvdGhyZWFkaW4ucHkKaW5kZXggZGVkNTczYS4uZmIyZWIyMSAxMDA2NDQKLS0tIGEvTGliL2Rvcy04eDMvdGhyZWFkaW4ucHkKKysrIGIvTGliL2Rvcy04eDMvdGhyZWFkaW4ucHkKQEAgLTE4LDYgKzE4LDcgQEAKIF9zdGFydF9uZXdfdGhyZWFkID0gdGhyZWFkLnN0YXJ0X25ld190aHJlYWQKIF9hbGxvY2F0ZV9sb2NrID0gdGhyZWFkLmFsbG9jYXRlX2xvY2sKIF9nZXRfaWRlbnQgPSB0aHJlYWQuZ2V0X2lkZW50CitUaHJlYWRFcnJvciA9IHRocmVhZC5lcnJvcgogZGVsIHRocmVhZAogCiBfcHJpbnRfZXhjID0gdHJhY2ViYWNrLnByaW50X2V4Ywo=