ZGlmZiAtLWdpdCBhL0NIQU5HRUxPRyBiL0NIQU5HRUxPRwppbmRleCBjMTQ5MmNjLi45MjQ0ZTY0IDEwMDY0NAotLS0gYS9DSEFOR0VMT0cKKysrIGIvQ0hBTkdFTE9HCkBAIC0yLDYgKzIsMTYgQEAKIENoYW5nZXMgZm9yIFUtQm9vdCAxLjAuMDoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorKiBQYXRjaCBieSBBbmRlcnMgTGFyc2VuLCAxOCBTZXAgMjAwMzoKKyAgYWxsb3cgbWtpbWFnZSB0byBidWlsZCBhbmQgcnVuIG9uIEN5Z3dpbi1ob3N0ZWQgc3lzdGVtcworCisqIFBhdGNoIGJ5IEZyYW5rIE38bGxlciwgMTggU2VwIDIwMDM6CisgIHVzZSBiaV9pbnRmcmVxIGluc3RlYWQgb2YgYmlfYnVzZnJlcSB0byBjb21wdXRlIGZlY19taWlfc3BlZWQgaW4KKyAgY3B1L21wYzh4eC9mZWMuYworCisqIFBhdGNoIGJ5IFBhbnRlbGlzIEFudG9uaW91LCAxNiBTZXAgMjAwMzoKKyAgYWRkIHRvb2wgdG8gY29tcHV0ZSBmaWxlZHMgaW4gdGhlIFBMUFJDUiByZWdpc3RlciBmb3IgTVBDODZ4CisKICogVXNlIElIX1RZUEVfRklMRVNZU1RFTSBmb3IgVFJBQiAiZGlzayIgaW1hZ2VzLgogCiAqIEZpeCBidWlsZCBwcm9ibGVtcyB1bmRlciBGcmVlQlNECmRpZmYgLS1naXQgYS9jcHUvbXBjOHh4L2ZlYy5jIGIvY3B1L21wYzh4eC9mZWMuYwppbmRleCA4YWM3ODQyLi42YjU3OWM5IDEwMDY0NAotLS0gYS9jcHUvbXBjOHh4L2ZlYy5jCisrKyBiL2NwdS9tcGM4eHgvZmVjLmMKQEAgLTM0OCw3ICszNDgsNyBAQAogCSAqIFRoaXMgTURDIGZyZXF1ZW5jeSBpcyBlcXVhbCB0byBzeXN0ZW0gY2xvY2sgLyAoMiAqIE1JSV9TUEVFRCkuCiAJICogVGhlbiBNSUlfU1BFRUQgPSBzeXN0ZW1fY2xvY2sgLyAyICogMiw1IE1oei4KIAkgKi8KLQlmZWNwLT5mZWNfbWlpX3NwZWVkID0gKChiZC0+YmlfYnVzZnJlcSArIDQ5OTk5OTkpIC8gNTAwMDAwMCkgPDwgMTsKKwlmZWNwLT5mZWNfbWlpX3NwZWVkID0gKChiZC0+YmlfaW50ZnJlcSArIDQ5OTk5OTkpIC8gNTAwMDAwMCkgPDwgMTsKIAogI2lmICFkZWZpbmVkKENPTkZJR19JQ1U4NjIpICYmICFkZWZpbmVkKENPTkZJR19JQUQyMTApCiAJLyogQ29uZmlndXJlIGFsbCBvZiBwb3J0IEQgZm9yIE1JSS4KQEAgLTYxMiw3ICs2MTIsNyBAQAogCSAqIFRoaXMgTURDIGZyZXF1ZW5jeSBpcyBlcXVhbCB0byBzeXN0ZW0gY2xvY2sgLyAoMiAqIE1JSV9TUEVFRCkuCiAJICogVGhlbiBNSUlfU1BFRUQgPSBzeXN0ZW1fY2xvY2sgLyAyICogMiw1IE1oei4KIAkgKi8KLQlmZWNwLT5mZWNfbWlpX3NwZWVkID0gKChiZC0+YmlfYnVzZnJlcSArIDQ5OTk5OTkpIC8gNTAwMDAwMCkgPDwgMTsKKwlmZWNwLT5mZWNfbWlpX3NwZWVkID0gKChiZC0+YmlfaW50ZnJlcSArIDQ5OTk5OTkpIC8gNTAwMDAwMCkgPDwgMTsKIAogI2lmICFkZWZpbmVkKENPTkZJR19JQ1U4NjIpICYmICFkZWZpbmVkKENPTkZJR19JQUQyMTApCiAJLyogQ29uZmlndXJlIGFsbCBvZiBwb3J0IEQgZm9yIE1JSS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmLmggYi9pbmNsdWRlL2VsZi5oCmluZGV4IDFiZTI5NGEuLjRlYTM5MjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZWxmLmgKKysrIGIvaW5jbHVkZS9lbGYuaApAQCAtNDMsMTMgKzQzLDYgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNlbmRpZgogCi0jaWZkZWYgX19DWUdXSU5fXwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCB1aW50MzJfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgdWludDE2X3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgIHVpbnQ4X3Q7Ci0jZW5kaWYgLyogX19DWUdXSU5fXyAqLwotCiAvKgogICogIFRoaXMgdmVyc2lvbiBkb2Vzbid0IHdvcmsgZm9yIDY0LWJpdCBBQklzIC0gRXJpay4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pbWFnZS5oIGIvaW5jbHVkZS9pbWFnZS5oCmluZGV4IDljNmY5NWIuLjdiZTE3ZTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvaW1hZ2UuaAorKysgYi9pbmNsdWRlL2ltYWdlLmgKQEAgLTEyNCwxMSArMTI0LDYgQEAKICNkZWZpbmUgSUhfTUFHSUMJMHgyNzA1MTk1NgkvKiBJbWFnZSBNYWdpYyBOdW1iZXIJCSovCiAjZGVmaW5lIElIX05NTEVOCQkzMgkvKiBJbWFnZSBOYW1lIExlbmd0aAkJKi8KIAotI2lmZGVmIF9fQ1lHV0lOX18KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1aW50MzJfdDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OwotI2VuZGlmIC8qIF9fQ1lHV0lOX18gKi8KLQogLyoKICAqIGFsbCBkYXRhIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAoYWthIG5hdHVyYWwgYWthIGJpZ2VuZGlhbikKICAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvTWFrZWZpbGUgYi90b29scy9NYWtlZmlsZQppbmRleCA2NTQ0NjdkLi5jMTMxM2EyIDEwMDY0NAotLS0gYS90b29scy9NYWtlZmlsZQorKysgYi90b29scy9NYWtlZmlsZQpAQCAtMzAsNiArMzAsMTIgQEAKIE9CSlMgICArPSBpbmNhLXN3YXAtYnl0ZXMubwogZW5kaWYKIAorIyBEb24ndCBidWlsZCBieSBkZWZhdWx0CisjaWZlcSAoJChBUkNIKSxwcGMpCisjQklOUyAgICs9IG1wYzg2eF9jbGskKFNGWCkKKyNPQkpTICAgKz0gbXBjODZ4X2Nsay5vCisjZW5kaWYKKwogTE9HT19ICT0gJChUT1BESVIpL2luY2x1ZGUvYm1wX2xvZ28uaAogCiBpZmVxICgkKExPR09fQk1QKSwpCkBAIC0xMzYsNiArMTQyLDEwIEBACiAJCSQoQ0MpICQoQ0ZMQUdTKSAkKEhPU1RfTERGTEFHUykgLW8gJEAgJF4KIAkJJChTVFJJUCkgJEAKIAorbXBjODZ4X2NsayQoU0ZYKToJbXBjODZ4X2Nsay5vCisJCSQoQ0MpICQoQ0ZMQUdTKSAkKEhPU1RfTERGTEFHUykgLW8gJEAgJF4KKwkJJChTVFJJUCkgJEAKKwogZW52Y3JjLm86CWVudmNyYy5jCiAJCSQoQ0MpIC1nICQoQ0ZMQUdTKSAtYyAkPAogCkBAIC0xNTEsNiArMTYxLDkgQEAKIGluY2Etc3dhcC1ieXRlcy5vOglpbmNhLXN3YXAtYnl0ZXMuYwogCQkkKENDKSAtZyAkKENGTEFHUykgLWMgJDwKIAorbXBjODZ4X2Nsay5vOgltcGM4NnhfY2xrLmMKKwkJJChDQykgLWcgJChDRkxBR1MpIC1jICQ8CisKIHN1YmRpcnM6CiBpZmVxICgkKFRPT0xTVUJESVJTKSwpCiAJCUA6CmRpZmYgLS1naXQgYS90b29scy9ta2ltYWdlLmMgYi90b29scy9ta2ltYWdlLmMKaW5kZXggMTQ4ZWU4ZC4uMGU4MzU0NiAxMDA2NDQKLS0tIGEvdG9vbHMvbWtpbWFnZS5jCisrKyBiL3Rvb2xzL21raW1hZ2UuYwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJaW1hZ2VmaWxlID0gKmFyZ3Y7CiAKIAlpZiAobGZsYWcpIHsKLQkJaWZkID0gb3BlbihpbWFnZWZpbGUsIE9fUkRPTkxZKTsKKwkJaWZkID0gb3BlbihpbWFnZWZpbGUsIE9fUkRPTkxZfE9fQklOQVJZKTsKIAl9IGVsc2UgewogCQlpZmQgPSBvcGVuKGltYWdlZmlsZSwgT19SRFdSfE9fQ1JFQVR8T19UUlVOQ3xPX0JJTkFSWSwgMDY2Nik7CiAJfQpAQCAtNTAyLDcgKzUwMiw3IEBACiAJCWZwcmludGYgKHN0ZGVyciwgIkFkZGluZyBJbWFnZSAlc1xuIiwgZGF0YWZpbGUpOwogCX0KIAotCWlmICgoZGZkID0gb3BlbihkYXRhZmlsZSwgT19SRE9OTFkpKSA8IDApIHsKKwlpZiAoKGRmZCA9IG9wZW4oZGF0YWZpbGUsIE9fUkRPTkxZfE9fQklOQVJZKSkgPCAwKSB7CiAJCWZwcmludGYgKHN0ZGVyciwgIiVzOiBDYW4ndCBvcGVuICVzOiAlc1xuIiwKIAkJCWNtZG5hbWUsIGRhdGFmaWxlLCBzdHJlcnJvcihlcnJubykpOwogCQlleGl0IChFWElUX0ZBSUxVUkUpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbXBjODZ4X2Nsay5jIGIvdG9vbHMvbXBjODZ4X2Nsay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZmJkNGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tcGM4NnhfY2xrLmMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDMgSW50cmFjb20gUy5BLgorICogUGFudGVsaXMgQW50b25pb3UgPHBhbnRvQGludHJhY29tLmdyPgorICoKKyAqIFRoaXMgbGl0dGxlIHByb2dyYW0gbWFrZXMgYW4gZXhoYXVzdGl2ZSBzZWFyY2ggZm9yIHRoZQorICogY29ycmVjdCB0ZXJtcyBvZiBwZGYsIG1maSwgbWZuLCBtZmQsIHMsIGRicm1vLCBpbiBQTFBSQ1IuCisgKiBUaGUgZ29hbCBpcyB0byBwcm9kdWNlIGEgZ2NsazIgZnJvbSBhIHhpbiBpbnB1dCwgd2hpbGUgcmVzcGVjdGluZworICogYWxsIHRoZSByZXN0cmljdGlvbnMgb24gdGhlaXIgY29tYmluYXRpb24uCisgKgorICogR2VuZXJhbHkgeW91IHNlbGVjdCB0aGUgZmlyc3Qgcm93IG9mIHRoZSBwcm9kdWNlZCB0YWJsZS4KKyAqCisgKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcworICogcHJvamVjdC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAorICogTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIERQUkVGX01JTgkgMTAwMDAwMDAKKyNkZWZpbmUgRFBSRUZfTUFYCSAzMjAwMDAwMAorCisjZGVmaW5lIERQR0RDS19NQVgJMzIwMDAwMDAwCisjZGVmaW5lIERQR0RDS19NSU4JMTYwMDAwMDAwCisKKyNkZWZpbmUgU19NSU4JCTAKKyNkZWZpbmUgU19NQVgJCTIKKworI2RlZmluZSBNRklfTUlOCQk1CisjZGVmaW5lIE1GSV9NQVgJCTE1CisKKyNkZWZpbmUgTUZOX01JTgkJMAorI2RlZmluZSBNRk5fTUFYCQkxNQorCisjZGVmaW5lIE1GRF9NSU4JCTAKKyNkZWZpbmUgTUZEX01BWAkJMzEKKworI2RlZmluZSBNRl9NSU4JCTUKKyNkZWZpbmUgTUZfTUFYCQkxNQorCisjZGVmaW5lIFBERl9NSU4JCTAKKyNkZWZpbmUgUERGX01BWAkJMTUKKworI2RlZmluZSBHQ0xLMl9NQVgJMTUwMDAwMDAwCisKK3N0YXRpYyBpbnQgY2FsY3VsYXRlIChpbnQgeGluLCBpbnQgdGFyZ2V0X2Nsb2NrLAorCQkgICAgICBpbnQgcHBtLCBpbnQgcGRmLCBpbnQgbWZpLCBpbnQgbWZuLCBpbnQgbWZkLCBpbnQgcywKKwkJICAgICAgaW50ICpkcHJlZnAsIGludCAqZHBnZGNrcCwgaW50ICpqZGJja3AsCisJCSAgICAgIGludCAqZ2NsazJwLCBpbnQgKmRicm1vcCkKK3sKKwl1bnNpZ25lZCBpbnQgZHByZWYsIGRwZ2RjaywgamRiY2ssIGdjbGsyLCB0MSwgdDIsIGRicm1vOworCisJLyogdmFsaWQgTUZJPyAqLworCWlmIChtZmkgPCBNRklfTUlOKQorCQlyZXR1cm4gLTE7CisKKwkvKiB2YWxpZCBudW0sIGRlbnVtPyAqLworCWlmIChtZm4gPiAwICYmIG1mbiA+PSBtZmQpCisJCXJldHVybiAtMTsKKworCWRwcmVmID0geGluIC8gKHBkZiArIDEpOworCisJLyogdmFsaWQgZHBlZj8gKi8KKwlpZiAoZHByZWYgPCBEUFJFRl9NSU4gfHwgZHByZWYgPiBEUFJFRl9NQVgpCisJCXJldHVybiAtMTsKKworCWlmIChtZm4gPT0gMCkgeworCQlkcGdkY2sgID0gKDIgKiBtZmkgKiB4aW4pIC8gKHBkZiArIDEpIDsKKwkJZGJybW8gPSAwOworCX0gZWxzZSB7CisJCS8qIDUgPD0gbWZpICsgKG1mbiAvIG1mZCArIDEpIDw9IDE1ICovCisJCXQxID0gbWZkICsgMTsKKwkJdDIgPSBtZmkgKiB0MSArIG1mbjsKKwkJaWYgKCBNRl9NSU4gKiB0MSA+IHQyIHx8IE1GX01BWCAqIHQxIDwgdDIpCisJCQlyZXR1cm4gLTE7CisKKwkJZHBnZGNrICA9ICh1bnNpZ25lZCBpbnQpKDIgKiAobWZpICogbWZkICsgbWZpICsgbWZuKSAqCisJCQkJKHVuc2lnbmVkIGludCl4aW4pIC8KKwkJCQkoKG1mZCArIDEpICogKHBkZiArIDEpKTsKKworCQlkYnJtbyA9IDEwICogbWZuIDwgKG1mZCArIDEpOworCX0KKworCS8qIHZhbGlkIGRwZ2Nsaz8gKi8KKwlpZiAoZHBnZGNrIDwgRFBHRENLX01JTiB8fCBkcGdkY2sgPiBEUEdEQ0tfTUFYKQorCQlyZXR1cm4gLTE7CisKKwlqZGJjayA9IGRwZ2RjayA+PiBzOworCWdjbGsyID0gamRiY2sgLyAyOworCisJLyogdmFsaWQgZ2NsazIgKi8KKwlpZiAoZ2NsazIgPiBHQ0xLMl9NQVgpCisJCXJldHVybiAtMTsKKworCXQxID0gYWJzKGdjbGsyIC0gdGFyZ2V0X2Nsb2NrKTsKKworCS8qIFhYWCBtYXggMU1IeiBkZXYuIGluIGNsb2NrICovCisJaWYgKHQxID4gMTAwMDAwMCkKKwkJcmV0dXJuIC0xOworCisJLyogZGV2IHdpdGhpbiByYW5nZSAoWFhYIGdjbGsyIHNjYWxlZCB0byBhdm9pZCBvdmVyZmxvdykgKi8KKwlpZiAodDEgKiAxMDAwID4gKHVuc2lnbmVkIGludClwcG0gKiAoZ2NsazIgLyAxMDAwKSkKKwkJcmV0dXJuIC0xOworCisJKmRwcmVmcCA9IGRwcmVmOworCSpkcGdkY2twID0gZHBnZGNrOworCSpqZGJja3AgPSBqZGJjazsKKwkqZ2NsazJwID0gZ2NsazI7CisJKmRicm1vcCA9IGRicm1vOworCisJcmV0dXJuIGdjbGsyOworfQorCitpbnQgY29uZl9jbG9jayhpbnQgeGluLCBpbnQgdGFyZ2V0X2Nsb2NrLCBpbnQgcHBtKQoreworCWludCBwZGYsIHMsIG1mbiwgbWZkLCBtZmk7CisJaW50IGRwcmVmLCBkcGdkY2ssIGpkYmNrLCBnY2xrMiwgeG91dCwgZGJybW87CisJaW50IGZvdW5kID0gMDsKKworCS8qIGludGVnZXIgbXVsdGlwbGllcnMgKi8KKwlmb3IgKHBkZiA9IFBERl9NSU47IHBkZiA8PSBQREZfTUFYOyBwZGYrKykgeworCQlmb3IgKG1maSA9IE1GSV9NSU47IG1maSA8PSBNRklfTUFYOyBtZmkrKykgeworCQkJZm9yIChzID0gMDsgcyA8PSBTX01BWDsgcysrKSB7CisJCQkJeG91dCA9IGNhbGN1bGF0ZSh4aW4sIHRhcmdldF9jbG9jaywKKwkJCQkJCSBwcG0sIHBkZiwgbWZpLCAwLCAwLCBzLAorCQkJCQkJICZkcHJlZiwgJmRwZ2RjaywgJmpkYmNrLAorCQkJCQkJICZnY2xrMiwgJmRicm1vKTsKKwkJCQlpZiAoeG91dCA8IDApCisJCQkJCWNvbnRpbnVlOworCisJCQkJaWYgKGZvdW5kID09IDApIHsKKwkJCQkJcHJpbnRmKCJwZGYgbWZpIG1mbiBtZmQgcyBkYnJtbyAgICAgZHByZWYgICAgZHBnZGNrICAgICBqZGJjayAgICAgZ2NsazIgZXhhY3Q/XG4iKTsKKwkJCQkJcHJpbnRmKCItLS0gLS0tIC0tLSAtLS0gLSAtLS0tLSAgICAgLS0tLS0gICAgLS0tLS0tICAgICAtLS0tLSAgICAgLS0tLS0gLS0tLS0tXG4iKTsKKwkJCQl9CisKKwkJCQlwcmludGYoIiUzZCAlM2QgLS0tIC0tLSAlMWQgJTVkICU5ZCAlOWQgJTlkICU5ZCVzXG4iLAorCQkJCQlwZGYsIG1maSwgcywgZGJybW8sCisJCQkJCWRwcmVmLCBkcGdkY2ssIGpkYmNrLCBnY2xrMiwKKwkJCQkJZ2NsazIgPT0gdGFyZ2V0X2Nsb2NrID8gIiAgICBZRVMiIDogIiIpOworCisJCQkJZm91bmQrKzsKKwkJCX0KKwkJfQorCX0KKworCS8qIGZyYWN0aW9uYWwgbXVsdGlwbGllcnMgKi8KKwlmb3IgKHBkZiA9IFBERl9NSU47IHBkZiA8PSBQREZfTUFYOyBwZGYrKykgeworCQlmb3IgKG1maSA9IE1GSV9NSU47IG1maSA8PSBNRklfTUFYOyBtZmkrKykgeworCQkJZm9yIChtZm4gPSAxOyBtZm4gPD0gTUZOX01BWDsgbWZuKyspIHsKKwkJCQlmb3IgKG1mZCA9IDE7IG1mZCA8PSBNRkRfTUFYOyBtZmQrKykgeworCQkJCQlmb3IgKHMgPSAwOyBzIDw9IFNfTUFYOyBzKyspIHsKKwkJCQkJCXhvdXQgPSBjYWxjdWxhdGUoeGluLCB0YXJnZXRfY2xvY2ssCisJCQkJCQkJICAgIHBwbSwgcGRmLCBtZmksIG1mbiwgbWZkLCBzLAorCQkJCQkJCSAgICAmZHByZWYsICZkcGdkY2ssICZqZGJjaywKKwkJCQkJCQkgICAgJmdjbGsyLCAmZGJybW8pOworCQkJCQkJaWYgKHhvdXQgPCAwKQorCQkJCQkJCWNvbnRpbnVlOworCisJCQkJCQlpZiAoZm91bmQgPT0gMCkgeworCQkJCQkJCXByaW50ZigicGRmIG1maSBtZm4gbWZkIHMgZGJybW8gICAgIGRwcmVmICAgIGRwZ2RjayAgICAgamRiY2sgICAgIGdjbGsyIGV4YWN0P1xuIik7CisJCQkJCQkJcHJpbnRmKCItLS0gLS0tIC0tLSAtLS0gLSAtLS0tLSAgICAgLS0tLS0gICAgLS0tLS0tICAgICAtLS0tLSAgICAgLS0tLS0gLS0tLS0tXG4iKTsKKwkJCQkJCX0KKworCQkJCQkJcHJpbnRmKCIlM2QgJTNkICUzZCAlM2QgJTFkICU1ZCAlOWQgJTlkICU5ZCAlOWQlc1xuIiwKKwkJCQkJCQlwZGYsIG1maSwgbWZuLCBtZmQsIHMsCisJCQkJCQkJZGJybW8sIGRwcmVmLCBkcGdkY2ssIGpkYmNrLCBnY2xrMiwKKwkJCQkJCQlnY2xrMiA9PSB0YXJnZXRfY2xvY2sgPyAiICAgIFlFUyIgOiAiIik7CisKKwkJCQkJCWZvdW5kKys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJfQorCX0KKworCXJldHVybiBmb3VuZDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgeGluLCB3YW50X2djbGsyLCBmb3VuZCwgcHBtID0gMTAwOworCisJaWYgKGFyZ2MgPCAzKSB7CisJCWZwcmludGYoc3RkZXJyLCAidXNhZ2U6IG1wYzg2eF9jbGsgPHhpbj4gPHdhbnRfZ2NsazI+IFtwcG1dXG4iKTsKKwkJZnByaW50ZihzdGRlcnIsICIgICAgICAgZGVmYXVsdCBwcG0gaXMgMTAwXG4iKTsKKwkJcmV0dXJuIDEwOworCX0KKworCXhpbiAgPSBhdG9pKGFyZ3ZbMV0pOworCXdhbnRfZ2NsazIgPSBhdG9pKGFyZ3ZbMl0pOworCWlmIChhcmdjID49IDQpCisJCXBwbSA9IGF0b2koYXJndlszXSk7CisKKwlmb3VuZCA9IGNvbmZfY2xvY2soeGluLCB3YW50X2djbGsyLCBwcG0pOworCWlmIChmb3VuZCA8PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY2Fubm90IHByb2R1Y2UgZ2NsazIgJWQgZnJvbSB4aW4gJWRcbiIsCisJCQl3YW50X2djbGsyLCB4aW4pOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9Cg==