ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCAwODY3NjBiLi5lYmY0NmYxIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTI2IEBACitNb24gTm92IDIyIDEzOjU4OjU2IDE5OTMgIERhdmlkIE1ldGNhbGZlIDxkYXZpZEBwcmlzbS5kZW1vbi5jby51az4KKworICAgICAgICAqIFt3aW5kb3dzL3Njcm9sbC5jXQorCVByZWxpbWluYXJ5IGltcGxlbWVudGF0aW9ucyBvZiBTY3JvbGxXaW5kb3csIFNjcm9sbERDIGFuZAorICAgICAgICBTY3JvbGxXaW5kb3dFeC4KKworTm92IDIxLCA5MyBtYXJ0aW4yQHRyZ2NvcnAuc29sdWNvcnAucWMuY2EgKE1hcnRpbiBBeW90dGUpCisKKwkqIFtjb250cm9scy9saXN0Ym94LmNdCisJT3B0aW1pemF0aW9uIG9mIHJlZHJhdyBkdXJpbmcgJ0FkZCcgb3IgJ0luc2VydCcuCisKKwkqIFtjb250cm9scy9zY3JvbGwuY10KKwlPcHRpbWl6YXRpb24gb2YgV01fUEFJTlQgZHVyaW5nICd0aHVtYnRyYWNraW5nJy4KKworCSogW2NvbnRyb2xzL2J1dHRvbi5jXQorCUFkZCBvZiBiZXRhIGltcGxlbWVudCBvZiAnQlNfT1dORVJEUkFXJworCisJKiBbY29udHJvbHMvc3RhdGljLmNdCisJU3R5bGUgJ1NTX0lDT04nIG5ldyBzdXBwb3J0ZWQuCisKKwkqIFttaXNjL21lc3NhZ2UuY10KKwlCZWdpbiBvZiBpbXBsZW1hbnRhdGlvbiBvZiBNQl9YWFggc3R5bGVzLgorCisJKiBbbG9hZGVyL3Jlc291cmNlLmNdCisJRnVuY3Rpb24gTG9hZEljb24oKSA6IG5vdyBwcmVwYXJlIHRyYW5zcGFyZW5jeSBCaXRtYXAgbWFzay4KKwlGdW5jdGlvbiBMb2FkQ3Vyc29yKCkgOiBub3cgcHJlcGFyZSBhICdYIHBpeG1hcGN1cnNvcicuCisJTmV3IGZ1bmN0aW9uIFNldEN1cnNvcigpIDogbm90IGZpbmlzaGVkLgorCU5ldyBmdW5jdGlvbiBTaG93Q3Vyc29yKCkgOiBub3QgZmluaXNoZWQuCisJTmV3IGZ1bmN0aW9uIEFjY2Vzc1Jlc291cmNlKCkgOiBzdHViLgorCisJKiBbb2JqL2RpYi5jXQorCUZ1bmN0aW9uIERyYXdJY29uKCk6IGRldWdnaW5nIHBoYXNlIG9mIGljb24gdHJhbnNwYXJlbmN5IG1hc2suCisKKwkqIFtsb2FkZXIvbGlicmFyeS5jXQorCW5ldyBmaWxlIGZvciBuZXdzIGZ1bmN0aW9ucyBMb2FkTGlicmFyeSgpICYgRnJlZUxpYnJhcnkoKS4KKworCSogW3N5c3Jlcy5kbGxdCisJUmVzb3VyY2VzIG9ubHkgMTZiaXRzIERMTCBmb3IgU3lzdGVtIFJlc291cmNlcywgaWNvbnMsIGV0Yy4uLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTdW4gTm92IDE0IDE0OjM5OjA2IDE5OTMgIGp1bGxpYXJkQGRpLmVwZmwuY2ggKEFsZXhhbmRyZSBKdWxsaWFyZCkKKworCSogW2luY2x1ZGUvZGlhbG9nLmhdIFt3aW5kb3dzL2RpYWxvZy5jXQorCVNpbXBsaWZpZWQgZGlhbG9nIHRlbXBsYXRlIHBhcnNpbmcuCisJSW1wbGVtZW50ZWQgRGlhbG9nQm94SW5kaXJlY3QoKS4KKworCSogW3dpbmRvd3Mvd2luLmNdCisJRml4ZWQgYnVnIGluIENyZWF0ZVdpbmRvdygpIHdoZW4gYWJvcnRpbmcgd2luZG93IGNyZWF0aW9uLgorCU1vZGlmaWVkIFVwZGF0ZVdpbmRvdygpIHRvIG9ubHkgdXBkYXRlIHZpc2libGUgd2luZG93cy4KKwlJbXBsZW1lbnRlZCBJc1dpbmRvdygpLgorCitOb3YgMTQsIDkzIG1hcnRpbjJAdHJnY29ycC5zb2x1Y29ycC5xYy5jYSAoTWFydGluIEF5b3R0ZSkKKworCSogW2NvbnRyb2xzL2xpc3Rib3guY10KKwlMaXN0Ym94IGNvbnRyb2wgd2luZG93IDogbmV3IG1lc3NhZ2VzLgorCisJKiBbY29udHJvbHMvY29tYm8uY10KKwlDb21ibyBib3ggY29udHJvbCB3aW5kb3cgOiBuZXcgbWVzc2FnZXMuCisKKwkqIFttaXNjL21lc3NhZ2UuY10KKwlNb3ZlZCBzdHViIE1lc3NhZ2VCb3goKSB0byB0aGlzIG5ldyBmaWxlLgorCUltcGxlbWVudGVkIG9mIGEgY2FsbGJhY2ssIG5vdyBNZXNzYWdlQm94IHNob3cgYSB3aW5kb3cuCisKKwkqIFtsb2FkZXIvcmVzb3VyY2UuY10KKwlOZXcgZnVuY3Rpb24gRGVzdHJveUljb24oKQorCU5ldyBmdW5jdGlvbiBEZXN0cm95Q3Vyc29yKCkKKwlGaWxsZWQgc3R1YiBMb2FkSWNvbigpCisJRmlsbGVkIHN0dWIgTG9hZEN1cnNvcigpCisJQnVnIGZpeGVkIGluIEZpbmRSZXNvdXJjZUJ5TmFtZSgpIDogbWlzc2luZyBsc2VlaygpLgorCisJKiBbb2JqL2RpYi5jXQorCU5ldyBmdW5jdGlvbiBEcmF3SWNvbigpCisKKwkqIFt3aW5kb3dzL3dpbi5jXQorCU5ldyBmdW5jdGlvbiBDbG9zZVdpbmRvdygpCisJTmV3IGZ1bmN0aW9uIE9wZW5JY29uKCkKKwlOZXcgZnVuY3Rpb24gSXNJY29uaWMoKQorCU5ldyBGdW5jdGlvbiBGaW5kV2luZG93KCkKKworU3VuIE5vdiAxNCAwODoyNzoxOSAxOTkzICBLYXJsIEd1ZW50ZXIgV3VlbnNjaCAoaHoyMjV3dUB1bmlkdWkudW5pLWR1aXNidXJnLmRlKQorCisJKiBbbG9hZGVyL3NlbGVjdG9yLmNdCisJV3JvdGUgQWxsb2NDU3RvRFNBbGlhcygpIGFuZCBBbGxvY0RTdG9DU0FsaWFzKCkKKworU3VuIE5vdiAxNCAwODoyNzoxOSAxOTkzICBCb2IgQW1zdGFkdCAgKGJvYiBhdCBhbXNjb25zKQorCisJKiBbbG9hZGVyL3NlbGVjdG9yLmNdCisJV3JvdGUgQWxsb2NTZWxlY3RvcigpIGFuZCBQcmVzdG9DaGFuZ29TZWxlY3RvcigpLiAgWVVLIQorCitTYXQgTm92IDEzIDEzOjU2OjQyIDE5OTMgIEJvYiBBbXN0YWR0ICAoYm9iIGF0IGFtc2NvbnMpCisKKwkqIFtsb2FkZXIvcmVzb3VyY2UuY10KKwlXcm90ZSBGaW5kUmVzb3VyY2UoKSwgTG9hZFJlc291cmNlKCksIExvY2tSZXNvdXJjZSgpLAorCWFuZCBGcmVlUmVzb3VyY2UoKQorCisJKiBbaW5jbHVkZS9zZWdtZW0uaF0gW2xvYWRlci9zZWxlY3Rvci5jXSBbbG9hZGVyL3NpZ25hbC5oXQorCUNoYW5nZWQgc2VsZWN0b3IgYWxsb2NhdGlvbiBtZXRob2QuCisKK1N1biBOb3YgMTAgMDg6Mjc6MTkgMTk5MyAgS2FybCBHdWVudGVyIFd1ZW5zY2ggKGh6MjI1d3VAdW5pZHVpLnVuaS1kdWlzYnVyZy5kZSkKKworCSogW2lmMTYzMi9jYWxsYmFjay5jIGlmMTYzMi9jYWxsLlMgaWYxNjMyL3VzZXIuc3BlY10gCisJYWRkZWQgQ2F0Y2ggKEtFUk5FTC41NSkgYW5kIFRocm93IChLRVJORUwuNTYpCisJCitOb3YgNywgOTMgbWFydGluMkB0cmdjb3JwLnNvbHVjb3JwLnFjLmNhIChNYXJ0aW4gQXlvdHRlKQorCisJKiBbY29udHJvbHMvc2Nyb2xsLmNdCisJU2Nyb2xsIGJhciBjb250cm9sIHdpbmRvdworCQlCdWcgcmVzb2x2ZWQgOiBQYWludGluZyBtZXNzYWdlIGJlZm9yZSBzY3JvbGwgdmlzaWJsZS4KKworCSogW2NvbnRyb2xzL2xpc3Rib3guY10KKwlMaXN0Ym94IGNvbnRyb2wgd2luZG93CisJCURlc3Ryb3kgY2xlYW51cC4KKworCSogW2NvbnRyb2xzL2NvbWJvLmNdCisJQ29tYm8gYm94IGNvbnRyb2wgd2luZG93CisJCURlc3Ryb3kgY2xlYW51cC4KKworCSogW2NvbnRyb2xzL2J1dHRvbi5jXQorCQlHZXRDaGVjayBNZXNzYWdlIG5vdyByZXR1cm4gaXMgc3RhdGUuCisKKwkqIFt3aW5kb3dzL3dpbi5jXQorCU5ldyBmdW5jdGlvbiBJc1dpbmRvd1Zpc2libGUoKQorCiBNb24gTm92ICAxIDE0OjQwOjIxIDE5OTMgIGp1bGxpYXJkQGRpLmVwZmwuY2ggKEFsZXhhbmRyZSBKdWxsaWFyZCkKIAogCSogW2lmMTYzMi91c2VyLnNwZWNdCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDhiNTA4ZDkuLjExYTg4NGEgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDYgKzEsNiBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBUaGVzZSB2YXJpYWJsZXMgYXJlIGluaGVyaXRlZCBieSB0aGUgc3ViLW1ha2VmaWxlcwotREVCVUdPUFRTPS1EREVCVUdfUkVTT1VSQ0UKK0RFQlVHT1BUUz0KIENPUFRTPS1PMiAtbTQ4NgogSU5DTFVERV9ESVI9aW5jbHVkZQogTERGTEFHUz0KZGlmZiAtLWdpdCBhL1JFQURNRSBiL1JFQURNRQppbmRleCA5ZTMyNmQ2Li5iYTBiODFiIDEwMDY0NAotLS0gYS9SRUFETUUKKysrIGIvUkVBRE1FCkBAIC0zMSw2ICszMSwxOSBAQAogSGF2ZSBhIG5pY2UgZ2FtZSBvZiBzb2xpdGFpcmUsIGJ1dCBiZSBjYXJlZnVsLiAgRW11bGF0aW9uIGlzbid0IHBlcmZlY3QuCiBTbywgb2NjYXNzaW9uYWxseSBpdCB3aWxsIGNyYXNoLgogCitXSEFUJ1MgTkVXIHdpdGggdmVyc2lvbiAwLjQuMTA6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQorCS0gQnVnIGZpeGVzCisJLSBNb3JlIHNjcm9sbCBiYXIgZnVuY3Rpb25zCisJLSBNb3JlIGljb24gYW5kIGN1cnNvciBoYW5kbGluZworCitXSEFUJ1MgTkVXIHdpdGggdmVyc2lvbiAwLjQuOTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCisJLSBCdWcgZml4ZXMKKwktIHJlYWwgTWVzc2FnZUJveCgpCisJLSBOZXcgcmVzb3VyY2UgZnVuY3Rpb25zCisJLSBJY29uIGZ1bmN0aW9ucworCS0gU2VsZWN0b3IgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucworCS0gQ2F0Y2goKS9UaHJvdygpCisKIFdIQVQnUyBORVcgd2l0aCB2ZXJzaW9uIDAuNC43OiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKIAktIE1vcmUgZGlhbG9nIGJveCBmdW5jdGlvbnMKIAktIE1vcmUgRE9TIGludGVycnVwdHMKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2J1dHRvbi5jIGIvY29udHJvbHMvYnV0dG9uLmMKaW5kZXggMWExM2I5ZC4uYWFkMmFhMSAxMDA2NDQKLS0tIGEvY29udHJvbHMvYnV0dG9uLmMKKysrIGIvY29udHJvbHMvYnV0dG9uLmMKQEAgLTksNiArOSw3IEBACiAKICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjaW5jbHVkZSAid2luLmgiCisjaW5jbHVkZSAidXNlci5oIgogCiBMT05HIEJ1dHRvblduZFByb2MoSFdORCBoV25kLCBXT1JEIHVNc2csIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSk7CiAKQEAgLTQ4LDYgKzQ5LDEwIEBACiBzdGF0aWMgTE9ORyBVQl9MQnV0dG9uRG93bihIV05EIGhXbmQsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSk7CiBzdGF0aWMgTE9ORyBVQl9MQnV0dG9uVXAoSFdORCBoV25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pOwogc3RhdGljIExPTkcgVUJfS2lsbEZvY3VzKEhXTkQgaFduZCk7CitzdGF0aWMgTE9ORyBPQl9QYWludChIV05EIGhXbmQpOworc3RhdGljIExPTkcgT0JfTEJ1dHRvbkRvd24oSFdORCBoV25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pOworc3RhdGljIExPTkcgT0JfTEJ1dHRvblVwKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKTsKK3N0YXRpYyBMT05HIE9CX0tpbGxGb2N1cyhIV05EIGhXbmQpOwogCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtNjAsNyArNjUsNyBAQAogICAgIExPTkcgKCpnZXRDaGVja2ZuKSgpOwogfSBCVE5GTjsKIAotI2RlZmluZSBNQVhfQlROX1RZUEUgIDEwCisjZGVmaW5lIE1BWF9CVE5fVFlQRSAgMTIKIAogc3RhdGljIEJUTkZOIGJ0bmZuW01BWF9CVE5fVFlQRV0gPQogewpAQCAtMTUzLDcgKzE1OCwyNSBAQAogCShMT05HKCopKCkpUkJfS2lsbEZvY3VzLAogCShMT05HKCopKCkpUkJfU2V0Q2hlY2ssCiAJKExPTkcoKikoKSlSQl9HZXRDaGVjawotICAgIH0KKyAgICB9LAorICAgIHsKKwkoTE9ORygqKSgpKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGRlZmluZWQgKi8KKwkoTE9ORygqKSgpKU5VTEwsCisJKExPTkcoKikoKSlOVUxMLAorCShMT05HKCopKCkpTlVMTCwKKwkoTE9ORygqKSgpKU5VTEwsCisJKExPTkcoKikoKSlOVUxMLAorCShMT05HKCopKCkpTlVMTAorICAgIH0sCisgICAgeyAKKwkoTE9ORygqKSgpKU9CX1BhaW50LCAgICAgICAgICAgICAgICAgICAgICAgLyogQlNfT1dORVJEUkFXICovCisJKExPTkcoKikoKSlPQl9MQnV0dG9uRG93biwKKwkoTE9ORygqKSgpKU9CX0xCdXR0b25VcCwKKwkoTE9ORygqKSgpKU5VTEwsCisJKExPTkcoKikoKSlPQl9LaWxsRm9jdXMsCisJKExPTkcoKikoKSlOVUxMLAorCShMT05HKCopKCkpTlVMTAorICAgIH0sCiB9OwogCiAKQEAgLTIzOSw3ICsyNjIsNyBAQAogCiAJY2FzZSBCTV9HRVRDSEVDSzoKIAkJaWYgKGJ0bmZuW3N0eWxlXS5nZXRDaGVja2ZuKQotCQkgICAgKGJ0bmZuW3N0eWxlXS5nZXRDaGVja2ZuKShoV25kKTsKKwkJICAgIHJldHVybiAoYnRuZm5bc3R5bGVdLmdldENoZWNrZm4pKGhXbmQpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC05NTQsMyArOTc3LDkxIEBACiAgICAgVXBkYXRlV2luZG93KGhXbmQpOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICBPd25lcmRyYXduIEJ1dHRvbiBGdW5jdGlvbnMKKyAqLworCitzdGF0aWMgTE9ORyBPQl9QYWludChIV05EIGhXbmQpCit7CisgICAgUEFJTlRTVFJVQ1QgcHM7CisgICAgSERDIAloREM7CisgICAgUkVDVCAJcmM7CisgICAgSEFORExFCWhEaXM7CisgICAgTFBEUkFXSVRFTVNUUlVDVCBscGRpczsKKyAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOworICAgIGhEQyA9IEJlZ2luUGFpbnQoaFduZCwgJnBzKTsKKyAgICBHZXRDbGllbnRSZWN0KGhXbmQsICZyYyk7CisgICAgaERpcyA9IFVTRVJfSEVBUF9BTExPQyhHTUVNX01PVkVBQkxFLCBzaXplb2YoRFJBV0lURU1TVFJVQ1QpKTsKKyAgICBscGRpcyA9IChMUERSQVdJVEVNU1RSVUNUKVVTRVJfSEVBUF9BRERSKGhEaXMpOworICAgIGxwZGlzLT5oREMgPSBoREM7CisgICAgbHBkaXMtPml0ZW1JRCA9IDA7CisgICAgQ29weVJlY3QoJmxwZGlzLT5yY0l0ZW0sICZyYyk7CisgICAgbHBkaXMtPkN0bElEID0gd25kUHRyLT53SURtZW51OworICAgIGxwZGlzLT5DdGxUeXBlID0gT0RUX0JVVFRPTjsKKyAgICBscGRpcy0+aXRlbUFjdGlvbiA9IE9EQV9EUkFXRU5USVJFOworLyogICAgcHJpbnRmKCJvd25lcmRyYXduIGJ1dHRvbiBXTV9EUkFXSVRFTSBDdHJsSUQ9JVhcbiIsIGxwZGlzLT5DdGxJRCk7Ki8KKyAgICBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaFduZCksIFdNX0RSQVdJVEVNLCAxLCAoTFBBUkFNKWxwZGlzKTsgCisgICAgVVNFUl9IRUFQX0ZSRUUoaERpcyk7CisgICAgRW5kUGFpbnQoaFduZCwgJnBzKTsKK30KKworc3RhdGljIExPTkcgT0JfTEJ1dHRvbkRvd24oSFdORCBoV25kLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pCit7CisgICAgSERDIAloREM7CisgICAgUkVDVCAJcmM7CisgICAgSEFORExFCWhEaXM7CisgICAgTFBEUkFXSVRFTVNUUlVDVCBscGRpczsKKyAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOworLyogICAgU2V0Rm9jdXMoaFduZCk7ICovCisgICAgU2V0Q2FwdHVyZShoV25kKTsKKyAgICBoREMgPSBHZXREQyhoV25kKTsKKyAgICBHZXRDbGllbnRSZWN0KGhXbmQsICZyYyk7CisgICAgaWYgKFB0SW5SZWN0KCZyYywgTUFLRVBPSU5UKGxQYXJhbSkpKQorCU5PVElGWV9QQVJFTlQoaFduZCwgQk5fQ0xJQ0tFRCk7CisgICAgR2V0Q2xpZW50UmVjdChoV25kLCAmcmMpOworICAgIGhEaXMgPSBVU0VSX0hFQVBfQUxMT0MoR01FTV9NT1ZFQUJMRSwgc2l6ZW9mKERSQVdJVEVNU1RSVUNUKSk7CisgICAgbHBkaXMgPSAoTFBEUkFXSVRFTVNUUlVDVClVU0VSX0hFQVBfQUREUihoRGlzKTsKKyAgICBscGRpcy0+aERDID0gaERDOworICAgIGxwZGlzLT5pdGVtSUQgPSAwOworICAgIENvcHlSZWN0KCZscGRpcy0+cmNJdGVtLCAmcmMpOworICAgIGxwZGlzLT5DdGxJRCA9IHduZFB0ci0+d0lEbWVudTsKKyAgICBscGRpcy0+Q3RsVHlwZSA9IE9EVF9CVVRUT047CisgICAgbHBkaXMtPml0ZW1BY3Rpb24gPSBPREFfU0VMRUNUOworICAgIFNlbmRNZXNzYWdlKEdldFBhcmVudChoV25kKSwgV01fRFJBV0lURU0sIDEsIChMUEFSQU0pbHBkaXMpOyAKKyAgICBVU0VSX0hFQVBfRlJFRShoRGlzKTsKKyAgICBSZWxlYXNlREMoaFduZCwgaERDKTsKK30KKworc3RhdGljIExPTkcgT0JfTEJ1dHRvblVwKEhXTkQgaFduZCwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQoreworICAgIEhEQyAJaERDOworICAgIFJFQ1QgCXJjOworICAgIEhBTkRMRQloRGlzOworICAgIExQRFJBV0lURU1TVFJVQ1QgbHBkaXM7CisgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKKyAgICBSZWxlYXNlQ2FwdHVyZSgpOworICAgIGhEQyA9IEdldERDKGhXbmQpOworICAgIEdldENsaWVudFJlY3QoaFduZCwgJnJjKTsKKyAgICBpZiAoUHRJblJlY3QoJnJjLCBNQUtFUE9JTlQobFBhcmFtKSkpCisJTk9USUZZX1BBUkVOVChoV25kLCBCTl9DTElDS0VEKTsKKyAgICBHZXRDbGllbnRSZWN0KGhXbmQsICZyYyk7CisgICAgaERpcyA9IFVTRVJfSEVBUF9BTExPQyhHTUVNX01PVkVBQkxFLCBzaXplb2YoRFJBV0lURU1TVFJVQ1QpKTsKKyAgICBscGRpcyA9IChMUERSQVdJVEVNU1RSVUNUKVVTRVJfSEVBUF9BRERSKGhEaXMpOworICAgIGxwZGlzLT5oREMgPSBoREM7CisgICAgbHBkaXMtPml0ZW1JRCA9IDA7CisgICAgQ29weVJlY3QoJmxwZGlzLT5yY0l0ZW0sICZyYyk7CisgICAgbHBkaXMtPkN0bElEID0gd25kUHRyLT53SURtZW51OworICAgIGxwZGlzLT5DdGxUeXBlID0gT0RUX0JVVFRPTjsKKyAgICBscGRpcy0+aXRlbUFjdGlvbiA9IE9EQV9TRUxFQ1Q7CisgICAgU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGhXbmQpLCBXTV9EUkFXSVRFTSwgMSwgKExQQVJBTSlscGRpcyk7IAorICAgIFVTRVJfSEVBUF9GUkVFKGhEaXMpOworICAgIFJlbGVhc2VEQyhoV25kLCBoREMpOworfQorCitzdGF0aWMgTE9ORyBPQl9LaWxsRm9jdXMoSFdORCBoV25kKQoreworICAgIEludmFsaWRhdGVSZWN0KGhXbmQsIE5VTEwsIEZBTFNFKTsKKyAgICBVcGRhdGVXaW5kb3coaFduZCk7Cit9CisKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbWJvLmMgYi9jb250cm9scy9jb21iby5jCmluZGV4IGVlOTA5NjIuLmU0NzE1ODkgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbWJvLmMKKysrIGIvY29udHJvbHMvY29tYm8uYwpAQCAtNzQsMTYgKzc0LDIwIEBACiAgICAgV05EICAJKnduZFB0cjsKICAgICBMUEhFQURDT01CTyBscGhjOwogICAgIGNoYXIJc3RyWzEyOF07CisgICAgUEFJTlRTVFJVQ1QgcGFpbnRzdHJ1Y3Q7CiAgICAgc3RhdGljIFJFQ1QgcmVjdHNlbDsKICAgICBzd2l0Y2gobWVzc2FnZSkKICAgICB7CiAgICAgY2FzZSBXTV9DUkVBVEU6CiAJQ3JlYXRlQ29tYm9TdHJ1Y3QoaHduZCk7CiAJd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7Ci0Jd2lkdGggPSB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLSB3bmRQdHItPnJlY3RDbGllbnQubGVmdDsKLQloZWlnaHQgPSB3bmRQdHItPnJlY3RDbGllbnQuYm90dG9tIC0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcDsKIAlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogCWlmIChscGhjID09IE5VTEwpIHJldHVybiAwOworI2lmZGVmIERFQlVHX0NPTUJPCisgICAgICAgIHByaW50ZigiQ29tYm8gV01fQ1JFQVRFICVsWCAhXG4iLCBscGhjKTsKKyNlbmRpZgorCXdpZHRoID0gd25kUHRyLT5yZWN0Q2xpZW50LnJpZ2h0IC0gd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQ7CisJaGVpZ2h0ID0gd25kUHRyLT5yZWN0Q2xpZW50LmJvdHRvbSAtIHduZFB0ci0+cmVjdENsaWVudC50b3A7CiAJbHBoYy0+aFduZERyb3AgPSBDcmVhdGVXaW5kb3coIkJVVFRPTiIsICIiLCAKICAgICAgICAgCVdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfVklTSUJMRSB8IEJTX1BVU0hCVVRUT04sCiAgICAgICAgIAl3aWR0aCAtIDE2LCAwLCAxNiwgMTYsIGh3bmQsIDEsIHduZFB0ci0+aEluc3RhbmNlLCAwTCk7CkBAIC05NCwyNSArOTgsMjMgQEAKICAgICAgICAgCVdTX0NISUxEIHwgV1NfQ0xJUENISUxEUkVOIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IExCU19OT1RJRlksCiAgICAgICAgIAl3bmRQdHItPnJlY3RDbGllbnQubGVmdCwgd25kUHRyLT5yZWN0Q2xpZW50LnRvcCArIDE2LCB3aWR0aCwgaGVpZ2h0LCAKICAgICAgICAgCXduZFB0ci0+aHduZFBhcmVudCwgMSwgd25kUHRyLT5oSW5zdGFuY2UsIChMUFNUUilNQUtFTE9ORygwLCBod25kKSk7Ci0vKgogICAgICAgICBTaG93V2luZG93KGxwaGMtPmhXbmRMQm94LCBTV19ISURFKTsKLSovCi0gICAgICAgIEludmFsaWRhdGVSZWN0KGxwaGMtPmhXbmRFZGl0LCBOVUxMLCBUUlVFKTsKLSAgICAgICAgVXBkYXRlV2luZG93KGxwaGMtPmhXbmRFZGl0KTsKLSAgICAgICAgSW52YWxpZGF0ZVJlY3QobHBoYy0+aFduZERyb3AsIE5VTEwsIFRSVUUpOwotICAgICAgICBVcGRhdGVXaW5kb3cobHBoYy0+aFduZERyb3ApOwogI2lmZGVmIERFQlVHX0NPTUJPCiAgICAgICAgIHByaW50ZigiQ29tYm8gQ3JlYXRpb24gRHJvcD0lWCBMQm94PSVYIVxuIiwgbHBoYy0+aFduZERyb3AsIGxwaGMtPmhXbmRMQm94KTsKICNlbmRpZgogCXJldHVybiAwOwogICAgIGNhc2UgV01fREVTVFJPWToKIAlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCWlmIChscGhjID09IDApIHJldHVybiAwOwogCURlc3Ryb3lXaW5kb3cobHBoYy0+aFduZERyb3ApOwogCURlc3Ryb3lXaW5kb3cobHBoYy0+aFduZEVkaXQpOworLyoKIAlEZXN0cm95V2luZG93KGxwaGMtPmhXbmRMQm94KTsKKyovCiAJZnJlZShscGhjKTsKKwkqKChMUEhFQURDT01CTyAqKSZ3bmRQdHItPndFeHRyYVsxXSkgPSAwOwogI2lmZGVmIERFQlVHX0NPTUJPCi0gICAgICAgIHByaW50ZigiQ29tYm8gV01fREVTVFJPWSAhXG4iKTsKKyAgICAgICAgcHJpbnRmKCJDb21ibyBXTV9ERVNUUk9ZICVsWCAhXG4iLCBscGhjKTsKICNlbmRpZgogCXJldHVybiAwOwogCQpAQCAtMTI4LDI0ICsxMzAsMzMgQEAKIAkgICAgbHBoYy0+ZHdTdGF0ZSA9IGxwaGMtPmR3U3RhdGUgXiBDQl9TSE9XRFJPUERPV047CiAJICAgIGlmICgobHBoYy0+ZHdTdGF0ZSAmIENCX1NIT1dEUk9QRE9XTikgPT0gQ0JfU0hPV0RST1BET1dOKSB7CiAJCVNob3dXaW5kb3cobHBoYy0+aFduZExCb3gsIFNXX1NIT1cpOworLyoKKwkJU2V0Rm9jdXMobHBoYy0+aFduZExCb3gpOworKi8KIAkJfQogCSAgICBlbHNlIHsKKy8qCisJCVNldEZvY3VzKGxwaGMtPmhXbmRFZGl0KTsKKyovCiAJCVNob3dXaW5kb3cobHBoYy0+aFduZExCb3gsIFNXX0hJREUpOwogCQl5ID0gU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVENVUlNFTCwgMCwgMEwpOwotCQlTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUVEVYVCwgKFdPUkQpeSwgKExQQVJBTSlzdHIpOwotCQlTZW5kTWVzc2FnZShscGhjLT5oV25kRWRpdCwgV01fU0VUVEVYVCwgKFdPUkQpeSwgKExQQVJBTSlzdHIpOwotCQlwcmludGYoImNvbWJvIGhpZGVcbiIpOworCQlpZiAoeSAhPSBMQl9FUlIpIHsKKwkJICAgIFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9HRVRURVhULCAoV09SRCl5LCAoTFBBUkFNKXN0cik7CisJCSAgICBTZW5kTWVzc2FnZShscGhjLT5oV25kRWRpdCwgV01fU0VUVEVYVCwgKFdPUkQpeSwgKExQQVJBTSlzdHIpOworCQkgICAgfQogCQl9CiAgICAgICAgICAgICB9CiAgICAgICAgIGlmIChMT1dPUkQobFBhcmFtKSA9PSBscGhjLT5oV25kTEJveCkgewogICAgICAgICAgICAgc3dpdGNoKEhJV09SRChsUGFyYW0pKQogICAgICAgICAJewogICAgICAgICAJY2FzZSBMQk5fU0VMQ0hBTkdFOgotCQkgICAgbHBoYy0+ZHdTdGF0ZSA9IGxwaGMtPmR3U3RhdGUgXiBDQl9TSE9XRFJPUERPV047CisJCSAgICBscGhjLT5kd1N0YXRlID0gbHBoYy0+ZHdTdGF0ZSAmIChDQl9TSE9XRFJPUERPV04gXiAweEZGRkYpOwogCQkgICAgU2hvd1dpbmRvdyhscGhjLT5oV25kTEJveCwgU1dfSElERSk7CiAJCSAgICB5ID0gU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVENVUlNFTCwgMCwgMEwpOwotCQkgICAgU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVFRFWFQsIChXT1JEKXksIChMUEFSQU0pc3RyKTsKLQkJICAgIFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRFZGl0LCBXTV9TRVRURVhULCAoV09SRCl5LCAoTFBBUkFNKXN0cik7CisJCSAgICBpZiAoeSAhPSBMQl9FUlIpIHsKKwkJICAgIAlTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUVEVYVCwgKFdPUkQpeSwgKExQQVJBTSlzdHIpOworCQkgICAgCVNlbmRNZXNzYWdlKGxwaGMtPmhXbmRFZGl0LCBXTV9TRVRURVhULCAoV09SRCl5LCAoTFBBUkFNKXN0cik7CisJCSAgICAJfQogCQkgICAgU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGh3bmQpLCBXTV9DT01NQU5ELCB3bmRQdHItPndJRG1lbnUsCiAJCQkgICAgICAgIAlNQUtFTE9ORyhod25kLCBDQk5fU0VMQ0hBTkdFKSk7CiAgICAgICAgIAkgICAgYnJlYWs7CkBAIC0xNjUsNiArMTc2LDggQEAKICAgICBjYXNlIFdNX0NUTENPTE9SOgogICAgIAlyZXR1cm4oU2VuZE1lc3NhZ2UoR2V0UGFyZW50KGh3bmQpLCBXTV9DVExDT0xPUiwgd1BhcmFtLCBsUGFyYW0pKTsKICAgICBjYXNlIFdNX1BBSU5UOgorCUJlZ2luUGFpbnQoIGh3bmQsICZwYWludHN0cnVjdCApOworCUVuZFBhaW50KCBod25kLCAmcGFpbnRzdHJ1Y3QgKTsKIAlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICAgICAgICBJbnZhbGlkYXRlUmVjdChscGhjLT5oV25kRWRpdCwgTlVMTCwgVFJVRSk7CiAgICAgICAgIFVwZGF0ZVdpbmRvdyhscGhjLT5oV25kRWRpdCk7CkBAIC0xNzUsMTcgKzE4OCw2IEBACiAJICAgIFVwZGF0ZVdpbmRvdyhscGhjLT5oV25kTEJveCk7CiAJICAgIH0KIAlicmVhazsKLSAgICBjYXNlIFdNX01PVVNFTU9WRToKLSAgICAgICAgaWYgKCh3UGFyYW0gJiBNS19MQlVUVE9OKSAhPSAwKSB7Ci0gICAgICAgICAgICB5ID0gSElXT1JEKGxQYXJhbSk7Ci0JICAgIGlmICh5IDwgNCkgewotCQlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwotCQl9Ci0JICAgIEdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOwotCSAgICBpZiAoeSA+IChyZWN0LmJvdHRvbSAtIDQpKSB7Ci0JCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0JCX0KLQkgICAgfQogICAgIGNhc2UgQ0JfQUREU1RSSU5HOgogI2lmZGVmIERFQlVHX0NPTUJPCiAgICAgICAgIHByaW50ZigiQ0JfQUREU1RSSU5HICclcycgIVxuIiwgKExQU1RSKWxQYXJhbSk7CkBAIC0xOTYsNiArMTk4LDEwIEBACiAgICAgICAgIHByaW50ZigiQ0JfR0VUTEJURVhUICMldSAhXG4iLCB3UGFyYW0pOwogCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgICAgICAgIHJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUVEVYVCwgd1BhcmFtLCBsUGFyYW0pKTsKKyAgICBjYXNlIENCX0dFVExCVEVYVExFTjoKKyAgICAgICAgcHJpbnRmKCJDQl9HRVRMQlRFWFRMRU4gIVxuIik7CisJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgICAgICAgcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9HRVRURVhUTEVOLCB3UGFyYW0sIGxQYXJhbSkpOwogICAgIGNhc2UgQ0JfSU5TRVJUU1RSSU5HOgogICAgICAgICBwcmludGYoIkNCX0lOU0VSVFNUUklORyAnJXMnICFcbiIsIChMUFNUUilsUGFyYW0pOwogCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CkBAIC0yMTAsMTcgKzIxNiw2NSBAQAogICAgICAgICByZXR1cm4oU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX1JFU0VUQ09OVEVOVCwgMCwgMEwpKTsKICAgICBjYXNlIENCX0RJUjoKICAgICAgICAgcHJpbnRmKCJDb21ib0JveCBDQl9ESVIgIVxuIik7CisJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgICAgICAgcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9ESVIsIHdQYXJhbSwgbFBhcmFtKSk7CiAgICAgY2FzZSBDQl9GSU5EU1RSSU5HOgorCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgICAgICAgIHJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfRklORFNUUklORywgd1BhcmFtLCBsUGFyYW0pKTsKICAgICBjYXNlIENCX0dFVENPVU5UOgorCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgICAgICAgIHJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUQ09VTlQsIDAsIDBMKSk7CiAgICAgY2FzZSBDQl9HRVRDVVJTRUw6CiAgICAgICAgIHByaW50ZigiQ29tYm9Cb3ggQ0JfR0VUQ1VSU0VMICFcbiIpOwotICAgICAgICByZXR1cm4oU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVENPVU5ULCAwLCAwTCkpOworCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICAgICAgIHJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfR0VUQ1VSU0VMLCAwLCAwTCkpOwogICAgIGNhc2UgQ0JfU0VUQ1VSU0VMOgotICAgICAgICBwcmludGYoIkNvbWJvQm94IENCX1NFVENVUlNFTCB3UGFyYW09JXggIVxuIiwgd1BhcmFtKTsKLSAgICAgICAgcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRMQm94LCBMQl9HRVRDT1VOVCwgd1BhcmFtLCAwTCkpOworICAgICAgICBwcmludGYoIkNvbWJvQm94IENCX1NFVENVUlNFTCB3UGFyYW09JVggIVxuIiwgd1BhcmFtKTsKKwlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworICAgICAgICByZXR1cm4oU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX1NFVENVUlNFTCwgd1BhcmFtLCAwTCkpOworICAgIGNhc2UgQ0JfR0VURURJVFNFTDoKKyAgICAgICAgcHJpbnRmKCJDb21ib0JveCBDQl9HRVRFRElUU0VMICFcbiIpOworCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisvKiAgICAgICAgcmV0dXJuKFNlbmRNZXNzYWdlKGxwaGMtPmhXbmRFZGl0LCBFTV9HRVRTRUwsIDAsIDBMKSk7ICovCisgICAgICAgIGJyZWFrOworICAgICBjYXNlIENCX1NFVEVESVRTRUw6CisgICAgICAgIHByaW50ZigiQ29tYm9Cb3ggQ0JfU0VURURJVFNFTCBsUGFyYW09JWxYICFcbiIsIGxQYXJhbSk7CisJbHBoYyA9IENvbWJvR2V0U3RvcmFnZUhlYWRlcihod25kKTsKKy8qICAgICAgICByZXR1cm4oU2VuZE1lc3NhZ2UobHBoYy0+aFduZEVkaXQsIEVNX1NFVFNFTCwgMCwgbFBhcmFtKSk7ICovCisJYnJlYWs7CisgICAgY2FzZSBDQl9TRUxFQ1RTVFJJTkc6CisgICAgICAgIHByaW50ZigiQ29tYm9Cb3ggQ0JfU0VMRUNUU1RSSU5HICFcbiIpOworCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0JfU0hPV0RST1BET1dOOgorICAgICAgICBwcmludGYoIkNvbWJvQm94IENCX1NIT1dEUk9QRE9XTiAhXG4iKTsKKwlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCWxwaGMtPmR3U3RhdGUgPSBscGhjLT5kd1N0YXRlIHwgQ0JfU0hPV0RST1BET1dOOworCWlmICh3UGFyYW0gIT0gMCkgeworCSAgICBTaG93V2luZG93KGxwaGMtPmhXbmRMQm94LCBTV19TSE9XKTsKKwkgICAgfQorCWVsc2UgeworCSAgICBscGhjLT5kd1N0YXRlID0gbHBoYy0+ZHdTdGF0ZSBeIENCX1NIT1dEUk9QRE9XTjsKKwkgICAgU2hvd1dpbmRvdyhscGhjLT5oV25kTEJveCwgU1dfSElERSk7CisJICAgIFNlbmRNZXNzYWdlKEdldFBhcmVudChod25kKSwgV01fQ09NTUFORCwgd25kUHRyLT53SURtZW51LAorCQkJICAgICAgICAJTUFLRUxPTkcoaHduZCwgQ0JOX0RST1BET1dOKSk7CisJICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQl9HRVRJVEVNREFUQToKKyAgICAgICAgcHJpbnRmKCJDb21ib0JveCBDQl9HRVRJVEVNREFUQSB3UGFyYW09JVggIVxuIiwgd1BhcmFtKTsKKwlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworICAgICAgICByZXR1cm4oU2VuZE1lc3NhZ2UobHBoYy0+aFduZExCb3gsIExCX0dFVElURU1EQVRBLCB3UGFyYW0sIDBMKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0JfU0VUSVRFTURBVEE6CisgICAgICAgIHByaW50ZigiQ29tYm9Cb3ggQ0JfU0VUSVRFTURBVEEgd1BhcmFtPSVYIGxQYXJhbT0lbFggIVxuIiwgd1BhcmFtLCBsUGFyYW0pOworCWxwaGMgPSBDb21ib0dldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICAgICAgIHJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kTEJveCwgTEJfU0VUSVRFTURBVEEsIHdQYXJhbSwgbFBhcmFtKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0JfTElNSVRURVhUOgorICAgICAgICBwcmludGYoIkNvbWJvQm94IENCX0xJTUlUVEVYVCAhXG4iKTsKKwlscGhjID0gQ29tYm9HZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworLyogICAgICAgIHJldHVybihTZW5kTWVzc2FnZShscGhjLT5oV25kRWRpdCwgRU1fTElNSVRURVhULCB3UGFyYW0sIDBMKSk7ICovCisgICAgICAgIGJyZWFrOwogCQogICAgIGRlZmF1bHQ6CiAJcmV0dXJuIERlZldpbmRvd1Byb2MoIGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtICk7CkBAIC0yMzUsNiArMjg5LDEwIEBACiAgICAgV05EICAqd25kUHRyOwogICAgIExQSEVBRENPTUJPIGxwaGM7CiAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisgICAgaWYgKHduZFB0ciA9PSAwKSB7CisgICAgCXByaW50ZigiQmFkIFdpbmRvdyBoYW5kbGUgb24gQ29tYm9Cb3ggIVxuIik7CisgICAgCXJldHVybiAwOworICAgIAl9CiAgICAgbHBoYyA9ICooKExQSEVBRENPTUJPICopJnduZFB0ci0+d0V4dHJhWzFdKTsKICAgICByZXR1cm4gbHBoYzsKIH0KQEAgLTI0Niw2ICszMDQsMTAgQEAKICAgICBXTkQgICp3bmRQdHI7CiAgICAgTFBIRUFEQ09NQk8gbHBoYzsKICAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKyAgICBpZiAod25kUHRyID09IDApIHsKKyAgICAJcHJpbnRmKCJCYWQgV2luZG93IGhhbmRsZSBvbiBDb21ib0JveCAhXG4iKTsKKyAgICAJcmV0dXJuIDA7CisgICAgCX0KICAgICBscGhjID0gKExQSEVBRENPTUJPKW1hbGxvYyhzaXplb2YoSEVBRENPTUJPKSk7CiAgICAgKigoTFBIRUFEQ09NQk8gKikmd25kUHRyLT53RXh0cmFbMV0pID0gbHBoYzsKICAgICBscGhjLT5kd1N0YXRlID0gMDsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2xpc3Rib3guYyBiL2NvbnRyb2xzL2xpc3Rib3guYwppbmRleCBkYzJhZTQ5Li5hNzFlYjkyIDEwMDY0NAotLS0gYS9jb250cm9scy9saXN0Ym94LmMKKysrIGIvY29udHJvbHMvbGlzdGJveC5jCkBAIC0xMDcsNiArMTA3LDkgQEAKICAgICBjYXNlIFdNX0NSRUFURToKIAlDcmVhdGVMaXN0Qm94U3RydWN0KGh3bmQpOwogCWxwaGwgPSBMaXN0Qm94R2V0V2luZG93QW5kU3RvcmFnZShod25kLCAmd25kUHRyKTsKKyNpZmRlZiBERUJVR19MSVNUQk9YCisgICAgICAgIHByaW50ZigiTGlzdEJveCBXTV9DUkVBVEUgJWxYICFcbiIsIGxwaGwpOworI2VuZGlmCiAJY3JlYXRlU3RydWN0ID0gKENSRUFURVNUUlVDVCAqKWxQYXJhbTsKICAgICAgCWlmIChISVdPUkQoY3JlYXRlU3RydWN0LT5scENyZWF0ZVBhcmFtcykgIT0gMCkKIAkgICAgbHBobC0+aFduZExvZ2ljUGFyZW50ID0gKEhXTkQpSElXT1JEKGNyZWF0ZVN0cnVjdC0+bHBDcmVhdGVQYXJhbXMpOwpAQCAtMTIyLDEwICsxMjUsMTQgQEAKIAlyZXR1cm4gMDsKICAgICBjYXNlIFdNX0RFU1RST1k6CiAgICAgICAgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKKyAgICAgICAgaWYgKGxwaGwgPT0gMCkgcmV0dXJuIDA7CiAJTGlzdEJveFJlc2V0Q29udGVudChod25kKTsKIAlEZXN0cm95V2luZG93KGxwaGwtPmhXbmRTY3JvbGwpOwogCWZyZWUobHBobCk7Ci0gICAgICAgIHByaW50ZigiTGlzdEJveCBXTV9ERVNUUk9ZICFcbiIpOworCSooKExQSEVBRExJU1QgKikmd25kUHRyLT53RXh0cmFbMV0pID0gMDsKKyNpZmRlZiBERUJVR19MSVNUQk9YCisgICAgICAgIHByaW50ZigiTGlzdEJveCBXTV9ERVNUUk9ZICVsWCAhXG4iLCBscGhsKTsKKyNlbmRpZgogCXJldHVybiAwOwogCiAgICAgY2FzZSBXTV9WU0NST0xMOgpAQCAtMTY0LDYgKzE3MSwxMCBAQAogCXJldHVybiAwOwogCQogICAgIGNhc2UgV01fTEJVVFRPTkRPV046CisvKgorCVNldEZvY3VzKGh3bmQpOworKi8KKwlTZXRDYXB0dXJlKGh3bmQpOwogICAgICAgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAgICAgICAgIGlmIChscGhsID09IE5VTEwpIHJldHVybiAwOwogCWxwaGwtPlByZXZTZWxlY3RlZCA9IGxwaGwtPkl0ZW1TZWxlY3RlZDsKQEAgLTE3NCw2ICsxODUsNyBAQAogICAgICAgICBVcGRhdGVXaW5kb3coaHduZCk7CiAJcmV0dXJuIDA7CiAgICAgY2FzZSBXTV9MQlVUVE9OVVA6CisJUmVsZWFzZUNhcHR1cmUoKTsKIAlscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7CiAgICAgICAgIGlmIChscGhsID09IE5VTEwpIHJldHVybiAwOwogCWlmIChscGhsLT5QcmV2U2VsZWN0ZWQgIT0gbHBobC0+SXRlbVNlbGVjdGVkKQpAQCAtMjQ4LDggKzI2MCwxMCBAQAogICAgIGNhc2UgTEJfRElSOgogICAgICAgICBwcmludGYoIkxpc3RCb3ggTEJfRElSICFcbiIpOwogCXdSZXQgPSBMaXN0Qm94RGlyZWN0b3J5KGh3bmQsIHdQYXJhbSwgKExQU1RSKWxQYXJhbSk7Ci0gICAgICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwotICAgICAgICBVcGRhdGVXaW5kb3coaHduZCk7CisJaWYgKElzV2luZG93VmlzaWJsZShod25kKSkgeworCSAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKwkgICAgVXBkYXRlV2luZG93KGh3bmQpOworCSAgICB9CiAJcmV0dXJuIHdSZXQ7CiAgICAgY2FzZSBMQl9BRERTVFJJTkc6CiAJd1JldCA9IExpc3RCb3hBZGRTdHJpbmcoaHduZCwgKExQU1RSKWxQYXJhbSk7CkBAIC0zMTUsMzAgKzMyOSwzOCBAQAogICAgICAgICBwcmludGYoIkxpc3RCb3ggTEJfU0VUQ1VSU0VMIHdQYXJhbT0leCAhXG4iLCB3UGFyYW0pOwogI2VuZGlmCiAJd1JldCA9IExpc3RCb3hTZXRDdXJTZWwoaHduZCwgd1BhcmFtKTsKLSAgICAgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7Ci0gICAgICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKKwlpZiAoSXNXaW5kb3dWaXNpYmxlKGh3bmQpKSB7CisJICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOworCSAgICBVcGRhdGVXaW5kb3coaHduZCk7CisJICAgIH0KIAlyZXR1cm4gd1JldDsKICAgICBjYXNlIExCX1NFVFNFTDoKICAgICAgICAgcHJpbnRmKCJMaXN0Qm94IExCX1NFVFNFTCB3UGFyYW09JXggbFBhcmFtPSVsWCAhXG4iLCB3UGFyYW0sIGxQYXJhbSk7CiAJd1JldCA9IExpc3RCb3hTZXRTZWwoaHduZCwgd1BhcmFtKTsKLSAgICAgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7Ci0gICAgICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKKwlpZiAoSXNXaW5kb3dWaXNpYmxlKGh3bmQpKSB7CisJICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOworCSAgICBVcGRhdGVXaW5kb3coaHduZCk7CisJICAgIH0KIAlyZXR1cm4gd1JldDsKICAgICBjYXNlIExCX1NFVFRPUElOREVYOgogICAgICAgICBwcmludGYoIkxpc3RCb3ggTEJfU0VUVE9QSU5ERVggd1BhcmFtPSV4ICFcbiIsIHdQYXJhbSk7CiAgICAgICAgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKIAlscGhsLT5GaXJzdFZpc2libGUgPSB3UGFyYW07CiAJU2V0U2Nyb2xsUG9zKGxwaGwtPmhXbmRTY3JvbGwsIFdNX1ZTQ1JPTEwsIGxwaGwtPkZpcnN0VmlzaWJsZSwgVFJVRSk7Ci0gICAgICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwotICAgICAgICBVcGRhdGVXaW5kb3coaHduZCk7CisJaWYgKElzV2luZG93VmlzaWJsZShod25kKSkgeworCSAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKKwkgICAgVXBkYXRlV2luZG93KGh3bmQpOworCSAgICB9CiAJYnJlYWs7CiAgICAgY2FzZSBMQl9TRVRJVEVNSEVJR0hUOgogI2lmZGVmIERFQlVHX0xJU1RCT1gKICAgICAgICAgcHJpbnRmKCJMaXN0Qm94IExCX1NFVElURU1IRUlHSFQgd1BhcmFtPSV4IGxQYXJhbT0lbFggIVxuIiwgd1BhcmFtLCBsUGFyYW0pOwogI2VuZGlmCiAJd1JldCA9IExpc3RCb3hTZXRJdGVtSGVpZ2h0KGh3bmQsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgICAgSW52YWxpZGF0ZVJlY3QoaHduZCwgTlVMTCwgVFJVRSk7Ci0gICAgICAgIFVwZGF0ZVdpbmRvdyhod25kKTsKKwlpZiAoSXNXaW5kb3dWaXNpYmxlKGh3bmQpKSB7CisJICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOworCSAgICBVcGRhdGVXaW5kb3coaHduZCk7CisJICAgIH0KIAlyZXR1cm4gd1JldDsKIAkKICAgICBkZWZhdWx0OgpAQCAtMzgxLDYgKzQwMywxMCBAQAogCWNoYXIJQ1sxMjhdOwogCWggPSAwOwogCWhkYyA9IEJlZ2luUGFpbnQoIGh3bmQsICZwcyApOworICAgIAlpZiAoIUlzV2luZG93VmlzaWJsZShod25kKSkgeworCSAgICBFbmRQYWludCggaHduZCwgJnBzICk7CisJICAgIHJldHVybjsKKwkgICAgfQogCUdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOwogICAgICAgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAJaWYgKGxwaGwgPT0gTlVMTCkgZ290byBFbmRPZlBhaW50OwpAQCAtNDI1LDcgKzQ1MSw2IEBACiB7CiAJTFBIRUFETElTVCAgbHBobDsKIAlMUExJU1RTVFJVQ1QgbHBsczsKLQlIQU5ETEUJaFRlbXA7CiAJUEFJTlRTVFJVQ1QgcHM7CiAJSEJSVVNIIAloQnJ1c2g7CiAJSFdORAloV25kUGFyZW50OwpAQCAtNDM1LDYgKzQ2MCwxMCBAQAogCWNoYXIJQ1sxMjhdOwogCWggPSAwOwogCWhkYyA9IEJlZ2luUGFpbnQoIGh3bmQsICZwcyApOworICAgIAlpZiAoIUlzV2luZG93VmlzaWJsZShod25kKSkgeworCSAgICBFbmRQYWludCggaHduZCwgJnBzICk7CisJICAgIHJldHVybjsKKwkgICAgfQogCUdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOwogICAgICAgICBscGhsID0gTGlzdEJveEdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CiAJaWYgKGxwaGwgPT0gTlVMTCkgZ290byBFbmRPZlBhaW50OwpAQCAtNDY1LDExICs0OTQsOSBAQAogCQkJbHBscy0+ZGlzLnJjSXRlbS5yaWdodCwgbHBscy0+ZGlzLnJjSXRlbS5ib3R0b20pOwogCQlwcmludGYoIkxCT1ggV01fRFJBV0lURU0gUGFyZW50PSVYICZkaXM9JWxYIEN0bElEPSV1ICFcbiIsIAogCQkJaFduZFBhcmVudCwgKExPTkcpJmxwbHMtPmRpcywgbHBscy0+ZGlzLkN0bElEKTsKLSNlbmRpZgogCQlwcmludGYoIkxCT1ggV01fRFJBV0lURU0gJyVzJyAhXG4iLCBscGxzLT5kaXMuaXRlbURhdGEpOworI2VuZGlmCiAJCVNlbmRNZXNzYWdlKGxwaGwtPmhXbmRMb2dpY1BhcmVudCwgV01fRFJBV0lURU0sIGksIChMUEFSQU0pJmxwbHMtPmRpcyk7Ci0JCUdsb2JhbFVubG9jayhoVGVtcCk7Ci0JCUdsb2JhbEZyZWUoaFRlbXApOwogCQlpZiAobHBscy0+ZGlzLml0ZW1TdGF0ZSAhPSAwKSB7CiAJCSAgICBJbnZlcnRSZWN0KGhkYywgJmxwbHMtPmRpcy5yY0l0ZW0pOwogCQkgICAgfQpAQCAtNTc1LDcgKzYwMiw4IEBACiAgICAgbHBsc25ldy0+ZGlzLml0ZW1JRCA9IGxwaGwtPkl0ZW1zQ291bnQ7CiAgICAgbHBsc25ldy0+ZGlzLml0ZW1EYXRhID0gKERXT1JEKW5ld3N0cjsKICAgICBscGxzbmV3LT5oRGF0YSA9IGhUZW1wOwotICAgIFNldFNjcm9sbFJhbmdlKGxwaGwtPmhXbmRTY3JvbGwsIFdNX1ZTQ1JPTEwsIDEsIGxwaGwtPkl0ZW1zQ291bnQsIFRSVUUpOworICAgIFNldFNjcm9sbFJhbmdlKGxwaGwtPmhXbmRTY3JvbGwsIFdNX1ZTQ1JPTEwsIDEsIGxwaGwtPkl0ZW1zQ291bnQsIAorICAgIAkobHBobC0+Rmlyc3RWaXNpYmxlICE9IDEpKTsKICAgICBpZiAobHBobC0+Rmlyc3RWaXNpYmxlID49IChscGhsLT5JdGVtc0NvdW50IC0gbHBobC0+SXRlbXNWaXNpYmxlKSkgewogICAgICAgICBJbnZhbGlkYXRlUmVjdChod25kLCBOVUxMLCBUUlVFKTsKICAgICAgICAgVXBkYXRlV2luZG93KGh3bmQpOwpAQCAtNjI1LDcgKzY1Myw4IEBACiAgICAgbHBsc25ldy0+ZGlzLml0ZW1JRCA9IGxwaGwtPkl0ZW1zQ291bnQ7CiAgICAgbHBsc25ldy0+ZGlzLml0ZW1EYXRhID0gKERXT1JEKW5ld3N0cjsKICAgICBscGxzbmV3LT5oRGF0YSA9IGhUZW1wOwotICAgIFNldFNjcm9sbFJhbmdlKGxwaGwtPmhXbmRTY3JvbGwsIFdNX1ZTQ1JPTEwsIDEsIGxwaGwtPkl0ZW1zQ291bnQsIFRSVUUpOworICAgIFNldFNjcm9sbFJhbmdlKGxwaGwtPmhXbmRTY3JvbGwsIFdNX1ZTQ1JPTEwsIDEsIGxwaGwtPkl0ZW1zQ291bnQsIAorICAgIAkobHBobC0+Rmlyc3RWaXNpYmxlICE9IDEpKTsKICAgICBpZiAoKChscGhsLT5JdGVtc0NvdW50IC0gbHBobC0+Rmlyc3RWaXNpYmxlKSA9PSBscGhsLT5JdGVtc1Zpc2libGUpICYmIAogICAgICAgICAobHBobC0+SXRlbXNWaXNpYmxlICE9IDApKSAKICAgICAJU2hvd1dpbmRvdyhscGhsLT5oV25kU2Nyb2xsLCBTV19OT1JNQUwpOwpAQCAtNzY4LDEwICs3OTcsMTAgQEAKICAgICBscGhsID0gTGlzdEJveEdldFdpbmRvd0FuZFN0b3JhZ2UoaHduZCwgJnduZFB0cik7CiAgICAgaWYgKGxwaGwgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKICAgICBscGhsLT5JdGVtU2VsZWN0ZWQgPSBMQl9FUlI7Ci0gICAgaWYgKHdJbmRleCA8IDEgfHwgd0luZGV4ID4gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKKyAgICBpZiAod0luZGV4IDwgMCB8fCB3SW5kZXggPj0gbHBobC0+SXRlbXNDb3VudCkgcmV0dXJuIExCX0VSUjsKICAgICBscGxzID0gbHBobC0+bHBGaXJzdDsKICAgICBpZiAobHBscyA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICAgIGZvcihpID0gMTsgaSA8PSBscGhsLT5JdGVtc0NvdW50OyBpKyspIHsKKyAgICBmb3IoaSA9IDA7IGkgPCBscGhsLT5JdGVtc0NvdW50OyBpKyspIHsKIAlscGxzMiA9IGxwbHM7CiAJbHBscyA9IChMUExJU1RTVFJVQ1QpbHBscy0+bHBOZXh0OwogCWlmIChpID09IHdJbmRleCkKQEAgLTc5NywxMCArODI2LDEwIEBACiAgICAgVUlOVAlpOwogICAgIGxwaGwgPSBMaXN0Qm94R2V0U3RvcmFnZUhlYWRlcihod25kKTsKICAgICBpZiAobHBobCA9PSBOVUxMKSByZXR1cm4gTEJfRVJSOwotICAgIGlmICh3SW5kZXggPCAxIHx8IHdJbmRleCA+IGxwaGwtPkl0ZW1zQ291bnQpIHJldHVybiBMQl9FUlI7CisgICAgaWYgKHdJbmRleCA8IDAgfHwgd0luZGV4ID49IGxwaGwtPkl0ZW1zQ291bnQpIHJldHVybiBMQl9FUlI7CiAgICAgbHBscyA9IGxwaGwtPmxwRmlyc3Q7CiAgICAgaWYgKGxwbHMgPT0gTlVMTCkgcmV0dXJuIExCX0VSUjsKLSAgICBmb3IoaSA9IDE7IGkgPD0gbHBobC0+SXRlbXNDb3VudDsgaSsrKSB7CisgICAgZm9yKGkgPSAwOyBpIDwgbHBobC0+SXRlbXNDb3VudDsgaSsrKSB7CiAJbHBsczIgPSBscGxzOwogCWxwbHMgPSAoTFBMSVNUU1RSVUNUKWxwbHMtPmxwTmV4dDsKIAlpZiAoaSA9PSB3SW5kZXgpIHsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3Njcm9sbC5jIGIvY29udHJvbHMvc2Nyb2xsLmMKaW5kZXggODM4MTZmNS4uZmQ4ZTQ1YSAxMDA2NDQKLS0tIGEvY29udHJvbHMvc2Nyb2xsLmMKKysrIGIvY29udHJvbHMvc2Nyb2xsLmMKQEAgLTg2LDExICs4NiwxNSBAQAogI2VuZGlmCiAJcmV0dXJuIDA7CiAgICAgY2FzZSBXTV9ERVNUUk9ZOgotCWxwaHMgPSBTY3JvbGxCYXJHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOworCWxwaHMgPSBTY3JvbGxCYXJHZXRXaW5kb3dBbmRTdG9yYWdlKGh3bmQsICZ3bmRQdHIpOworCWlmIChscGhzID09IDApIHJldHVybiAwOworI2lmZGVmIERFQlVHX1NDUk9MTAorICAgICAgICBwcmludGYoIlNjcm9sbEJhciBXTV9ERVNUUk9ZICVsWCAhXG4iLCBscGhzKTsKKyNlbmRpZgogCURlc3Ryb3lXaW5kb3cobHBocy0+aFduZFVwKTsKIAlEZXN0cm95V2luZG93KGxwaHMtPmhXbmREb3duKTsKIAlmcmVlKGxwaHMpOwotICAgICAgICBwcmludGYoIlNjcm9sbEJhciBXTV9ERVNUUk9ZICFcbiIpOworCSooKExQSEVBRFNDUk9MTCAqKSZ3bmRQdHItPndFeHRyYVsxXSkgPSAwOwogCXJldHVybiAwOwogCQogICAgIGNhc2UgV01fQ09NTUFORDoKQEAgLTEwNSwxMCArMTA5LDE3IEBACiAgICAgICAgIGlmIChMT1dPUkQobFBhcmFtKSA9PSBscGhzLT5oV25kRG93bikKICAgICAgICAgICAgIFNlbmRNZXNzYWdlKHduZFB0ci0+aHduZFBhcmVudCwgbHBocy0+RGlyZWN0aW9uLCAKICAgICAgICAgICAgIAlTQl9MSU5FRE9XTiwgTUFLRUxPTkcoMCwgaHduZCkpOworLyoKKwlTZXRGb2N1cyhod25kKTsKKyovCiAJcmV0dXJuIDA7CiAKICAgICBjYXNlIFdNX0xCVVRUT05ET1dOOgogCWxwaHMgPSBTY3JvbGxCYXJHZXRXaW5kb3dBbmRTdG9yYWdlKGh3bmQsICZ3bmRQdHIpOworLyoKKwlTZXRGb2N1cyhod25kKTsKKyovCisJU2V0Q2FwdHVyZShod25kKTsKIAlHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKIAlpZiAobHBocy0+RGlyZWN0aW9uID09IFdNX1ZTQ1JPTEwpIHsKIAkgICAgeSA9IEhJV09SRChsUGFyYW0pOwpAQCAtMTUyLDExICsxNjMsMTMgQEAKIAkgICAgfQogCWJyZWFrOwogICAgIGNhc2UgV01fTEJVVFRPTlVQOgorCWxwaHMgPSBTY3JvbGxCYXJHZXRTdG9yYWdlSGVhZGVyKGh3bmQpOwogICAgICAgICBscGhzLT5UaHVtYkFjdGl2ZSA9IEZBTFNFOworCVJlbGVhc2VDYXB0dXJlKCk7CiAJYnJlYWs7CiAKICAgICBjYXNlIFdNX0tFWURPV046Ci0gICAgICAgIHByaW50ZigiU2Nyb2xsQmFyIFdNX0tFWURPV04gd1BhcmFtICVYIVxuIiwgd1BhcmFtKTsKKyAgICAgICAgcHJpbnRmKCJTY3JvbGxCYXIgV01fS0VZRE9XTiB3UGFyYW0gJVggIVxuIiwgd1BhcmFtKTsKIAlicmVhazsKICAgICBjYXNlIFdNX1BBSU5UOgogCVN0ZERyYXdTY3JvbGxCYXIoaHduZCk7CkBAIC0xOTIsNiArMjA1LDEwIEBACiAgICAgV05EICAqUHRyOwogICAgIExQSEVBRFNDUk9MTCBscGhzOwogICAgICood25kUHRyKSA9IFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOworICAgIGlmIChQdHIgPT0gMCkgeworICAgIAlwcmludGYoIkJhZCBXaW5kb3cgaGFuZGxlIG9uIFNjcm9sbEJhciAhXG4iKTsKKyAgICAJcmV0dXJuIDA7CisgICAgCX0KICAgICBscGhzID0gKigoTFBIRUFEU0NST0xMICopJlB0ci0+d0V4dHJhWzFdKTsKICAgICByZXR1cm4gbHBoczsKIH0KQEAgLTIwMiw2ICsyMTksMTAgQEAKICAgICBXTkQgICp3bmRQdHI7CiAgICAgTFBIRUFEU0NST0xMIGxwaHM7CiAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisgICAgaWYgKHduZFB0ciA9PSAwKSB7CisgICAgCXByaW50ZigiQmFkIFdpbmRvdyBoYW5kbGUgb24gU2Nyb2xsQmFyICFcbiIpOworICAgIAlyZXR1cm4gMDsKKyAgICAJfQogICAgIGxwaHMgPSAqKChMUEhFQURTQ1JPTEwgKikmd25kUHRyLT53RXh0cmFbMV0pOwogICAgIHJldHVybiBscGhzOwogfQpAQCAtMjA5LDQ5ICsyMzAsNTMgQEAKIAogdm9pZCBTdGREcmF3U2Nyb2xsQmFyKEhXTkQgaHduZCkKIHsKLQlMUEhFQURTQ1JPTEwgbHBoczsKLQlQQUlOVFNUUlVDVCBwczsKLQlIQlJVU0ggaEJydXNoOwotCUhEQyBoZGM7Ci0JUkVDVCByZWN0OwotCVVJTlQgIGksIHcsIGgsIHNpejsKLQljaGFyCUNbMTI4XTsKLQloZGMgPSBCZWdpblBhaW50KCBod25kLCAmcHMgKTsKLQloQnJ1c2ggPSBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFdNX0NUTENPTE9SLCAoV09SRCloZGMsCi0JCSAgICBNQUtFTE9ORyhod25kLCBDVExDT0xPUl9TQ1JPTExCQVIpKTsKLQlpZiAoaEJydXNoID09IChIQlJVU0gpTlVMTCkgIGhCcnVzaCA9IEdldFN0b2NrT2JqZWN0KExUR1JBWV9CUlVTSCk7Ci0JbHBocyA9IFNjcm9sbEJhckdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0JaWYgKGxwaHMgPT0gTlVMTCkgZ290byBFbmRPZlBhaW50OwotCUdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOwotCXcgPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OwotCWggPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wOwotCWlmIChscGhzLT5EaXJlY3Rpb24gPT0gV01fVlNDUk9MTCkgewotCSAgICByZWN0LnRvcCArPSB3OwotCSAgICByZWN0LmJvdHRvbSAtPSB3OwotCSAgICB9Ci0JZWxzZSB7Ci0JICAgIHJlY3QubGVmdCArPSBoOwotCSAgICByZWN0LnJpZ2h0IC09IGg7Ci0JICAgIH0KLQlGaWxsUmVjdChoZGMsICZyZWN0LCBoQnJ1c2gpOwotCWlmIChscGhzLT5EaXJlY3Rpb24gPT0gV01fVlNDUk9MTCkKLQkgICAgU2V0UmVjdCgmcmVjdCwgMCwgbHBocy0+Q3VyUGl4ICsgdywgCi0JICAgIAkJdywgbHBocy0+Q3VyUGl4ICsgKHcgPDwgMSkpOwotCWVsc2UKLQkgICAgU2V0UmVjdCgmcmVjdCwgbHBocy0+Q3VyUGl4ICsgaCwgCi0JICAgIAkJMCwgbHBocy0+Q3VyUGl4ICsgKGggPDwgMSksIGgpOwotCUZyYW1lUmVjdChoZGMsICZyZWN0LCBHZXRTdG9ja09iamVjdChCTEFDS19CUlVTSCkpOwotCUluZmxhdGVSZWN0KCZyZWN0LCAtMSwgLTEpOwotCUZpbGxSZWN0KGhkYywgJnJlY3QsIEdldFN0b2NrT2JqZWN0KExUR1JBWV9CUlVTSCkpOwotCURyYXdSZWxpZWZSZWN0KGhkYywgcmVjdCwgMiwgMCk7Ci0JSW5mbGF0ZVJlY3QoJnJlY3QsIC0zLCAtMyk7Ci0JRHJhd1JlbGllZlJlY3QoaGRjLCByZWN0LCAxLCAxKTsKLUVuZE9mUGFpbnQ6CisgICAgTFBIRUFEU0NST0xMIGxwaHM7CisgICAgUEFJTlRTVFJVQ1QgcHM7CisgICAgSEJSVVNIIGhCcnVzaDsKKyAgICBIREMgaGRjOworICAgIFJFQ1QgcmVjdDsKKyAgICBVSU5UICBpLCB3LCBoLCBzaXo7CisgICAgY2hhcglDWzEyOF07CisgICAgaGRjID0gQmVnaW5QYWludCggaHduZCwgJnBzICk7CisgICAgaWYgKCFJc1dpbmRvd1Zpc2libGUoaHduZCkpIHsKIAlFbmRQYWludCggaHduZCwgJnBzICk7Ci0gICAgICAgIEludmFsaWRhdGVSZWN0KGxwaHMtPmhXbmRVcCwgTlVMTCwgVFJVRSk7Ci0gICAgICAgIFVwZGF0ZVdpbmRvdyhscGhzLT5oV25kVXApOwotICAgICAgICBJbnZhbGlkYXRlUmVjdChscGhzLT5oV25kRG93biwgTlVMTCwgVFJVRSk7Ci0gICAgICAgIFVwZGF0ZVdpbmRvdyhscGhzLT5oV25kRG93bik7CisJcmV0dXJuOworCX0KKyAgICBoQnJ1c2ggPSBTZW5kTWVzc2FnZShHZXRQYXJlbnQoaHduZCksIFdNX0NUTENPTE9SLCAoV09SRCloZGMsCisJCQlNQUtFTE9ORyhod25kLCBDVExDT0xPUl9TQ1JPTExCQVIpKTsKKyAgICBpZiAoaEJydXNoID09IChIQlJVU0gpTlVMTCkgIGhCcnVzaCA9IEdldFN0b2NrT2JqZWN0KExUR1JBWV9CUlVTSCk7CisgICAgbHBocyA9IFNjcm9sbEJhckdldFN0b3JhZ2VIZWFkZXIoaHduZCk7CisgICAgaWYgKGxwaHMgPT0gTlVMTCkgZ290byBFbmRPZlBhaW50OworICAgIEdldENsaWVudFJlY3QoaHduZCwgJnJlY3QpOworICAgIHcgPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OworICAgIGggPSByZWN0LmJvdHRvbSAtIHJlY3QudG9wOworICAgIGlmIChscGhzLT5EaXJlY3Rpb24gPT0gV01fVlNDUk9MTCkgeworCXJlY3QudG9wICs9IHc7CisJcmVjdC5ib3R0b20gLT0gdzsKKwl9CisgICAgZWxzZSB7CisJcmVjdC5sZWZ0ICs9IGg7CisJcmVjdC5yaWdodCAtPSBoOworCX0KKyAgICBGaWxsUmVjdChoZGMsICZyZWN0LCBoQnJ1c2gpOworICAgIGlmIChscGhzLT5EaXJlY3Rpb24gPT0gV01fVlNDUk9MTCkKKwlTZXRSZWN0KCZyZWN0LCAwLCBscGhzLT5DdXJQaXggKyB3LCB3LCBscGhzLT5DdXJQaXggKyAodyA8PCAxKSk7CisgICAgZWxzZQorCVNldFJlY3QoJnJlY3QsIGxwaHMtPkN1clBpeCArIGgsIDAsIGxwaHMtPkN1clBpeCArIChoIDw8IDEpLCBoKTsKKyAgICBGcmFtZVJlY3QoaGRjLCAmcmVjdCwgR2V0U3RvY2tPYmplY3QoQkxBQ0tfQlJVU0gpKTsKKyAgICBJbmZsYXRlUmVjdCgmcmVjdCwgLTEsIC0xKTsKKyAgICBGaWxsUmVjdChoZGMsICZyZWN0LCBHZXRTdG9ja09iamVjdChMVEdSQVlfQlJVU0gpKTsKKyAgICBEcmF3UmVsaWVmUmVjdChoZGMsIHJlY3QsIDIsIDApOworICAgIEluZmxhdGVSZWN0KCZyZWN0LCAtMywgLTMpOworICAgIERyYXdSZWxpZWZSZWN0KGhkYywgcmVjdCwgMSwgMSk7CisgICAgaWYgKCFscGhzLT5UaHVtYkFjdGl2ZSkgeworCUludmFsaWRhdGVSZWN0KGxwaHMtPmhXbmRVcCwgTlVMTCwgVFJVRSk7CisJVXBkYXRlV2luZG93KGxwaHMtPmhXbmRVcCk7CisJSW52YWxpZGF0ZVJlY3QobHBocy0+aFduZERvd24sIE5VTEwsIFRSVUUpOworCVVwZGF0ZVdpbmRvdyhscGhzLT5oV25kRG93bik7CisJfQorRW5kT2ZQYWludDoKKyAgICBFbmRQYWludCggaHduZCwgJnBzICk7CiB9CiAKIApAQCAtMjY0LDE2ICsyODksMjIgQEAKICAgICBMUEhFQURTQ1JPTEwgbHBoczsKICAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKICAgICBscGhzID0gKExQSEVBRFNDUk9MTCltYWxsb2Moc2l6ZW9mKEhFQURTQ1JPTEwpKTsKKyAgICBpZiAobHBocyA9PSAwKSB7CisgICAgCXByaW50ZigiQmFkIE1lbW9yeSBBbGxvYyBvbiBTY3JvbGxCYXIgIVxuIik7CisgICAgCXJldHVybiAwOworICAgIAl9CisKKyNpZmRlZiBERUJVR19TQ1JPTEwKKyAgICAgICAgcHJpbnRmKCJDcmVhdGVTY3JvbGxCYXJTdHJ1Y3QgJWxYICFcbiIsIGxwaHMpOworI2VuZGlmCiAgICAgKigoTFBIRUFEU0NST0xMICopJnduZFB0ci0+d0V4dHJhWzFdKSA9IGxwaHM7Ci0gICAgbHBocy0+VGh1bWJBY3RpdmU7CisgICAgbHBocy0+VGh1bWJBY3RpdmUgPSBGQUxTRTsKICAgICBscGhzLT5NaW5WYWwgPSAwOwogICAgIGxwaHMtPk1heFZhbCA9IDEwMDsKICAgICBscGhzLT5DdXJWYWwgPSAwOwogICAgIGxwaHMtPkN1clBpeCA9IDA7CiAgICAgd2lkdGggPSB3bmRQdHItPnJlY3RDbGllbnQucmlnaHQgLSB3bmRQdHItPnJlY3RDbGllbnQubGVmdDsKICAgICBoZWlnaHQgPSB3bmRQdHItPnJlY3RDbGllbnQuYm90dG9tIC0gd25kUHRyLT5yZWN0Q2xpZW50LnRvcDsKLSAgICBscGhzID0gU2Nyb2xsQmFyR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgICBpZiAobHBocyA9PSBOVUxMKSByZXR1cm4gMDsKICAgICBpZiAod2lkdGggPD0gaGVpZ2h0KQogCXsKIAlscGhzLT5NYXhQaXggPSBoZWlnaHQgLSAzICogd2lkdGg7CkBAIC0zMDgsNyArMzM5LDcgQEAKIHsKICAgICBMUEhFQURTQ1JPTEwgbHBoczsKICAgICBscGhzID0gU2Nyb2xsQmFyR2V0U3RvcmFnZUhlYWRlcihod25kKTsKLSAgICBpZiAobHBocyA9PSBOVUxMKSByZXR1cm47CisgICAgaWYgKGxwaHMgPT0gTlVMTCkgcmV0dXJuIDA7CiAgICAgcmV0dXJuIGxwaHMtPkN1clZhbDsKIH0KIApAQCAtMzMwLDcgKzM2MSw3IEBACiAgICAgaW50IG5SZXQ7CiAgICAgTFBIRUFEU0NST0xMIGxwaHM7CiAgICAgbHBocyA9IFNjcm9sbEJhckdldFN0b3JhZ2VIZWFkZXIoaHduZCk7Ci0gICAgaWYgKGxwaHMgPT0gTlVMTCkgcmV0dXJuOworICAgIGlmIChscGhzID09IE5VTEwpIHJldHVybiAwOwogICAgIG5SZXQgPSBscGhzLT5DdXJWYWw7CiAgICAgbHBocy0+Q3VyVmFsID0gKHNob3J0KW5Qb3M7CiAgICAgaWYgKGxwaHMtPk1heFZhbCAhPSBscGhzLT5NaW5WYWwpCkBAIC0zNDMsNyArMzc0LDcgQEAKICAgICBwcmludGYoIlNldFNjcm9sbFBvcyBtaW49JWQgbWF4PSVkXG4iLCAKIAkgICAgbHBocy0+TWluVmFsLCBscGhzLT5NYXhWYWwpOwogI2VuZGlmCi0gICAgaWYgKGJSZWRyYXcpIHsKKyAgICBpZiAoKGJSZWRyYXcpICYmIChJc1dpbmRvd1Zpc2libGUoaHduZCkpKSB7CiAgICAgICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwogICAgICAgICBVcGRhdGVXaW5kb3coaHduZCk7CiAgICAgICAgIH0KQEAgLTM2Nyw3ICszOTgsNyBAQAogI2lmZGVmIERFQlVHX1NDUk9MTAogICAgIHByaW50ZigiU2V0U2Nyb2xsUmFuZ2UgbWluPSVkIG1heD0lZFxuIiwgbHBocy0+TWluVmFsLCBscGhzLT5NYXhWYWwpOwogI2VuZGlmCi0gICAgaWYgKGJSZWRyYXcpIHsKKyAgICBpZiAoKGJSZWRyYXcpICYmIChJc1dpbmRvd1Zpc2libGUoaHduZCkpKSB7CiAgICAgICAgIEludmFsaWRhdGVSZWN0KGh3bmQsIE5VTEwsIFRSVUUpOwogICAgICAgICBVcGRhdGVXaW5kb3coaHduZCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3N0YXRpYy5jIGIvY29udHJvbHMvc3RhdGljLmMKaW5kZXggNDBlNWZiYi4uNjkyODEzOSAxMDA2NDQKLS0tIGEvY29udHJvbHMvc3RhdGljLmMKKysrIGIvY29udHJvbHMvc3RhdGljLmMKQEAgLTE2LDYgKzE2LDggQEAKIHN0YXRpYyBMT05HIFBhaW50VGV4dGZuKEhXTkQgaHduZCk7CiBzdGF0aWMgTE9ORyBQYWludFJlY3RmbihIV05EIGh3bmQpOwogc3RhdGljIExPTkcgUGFpbnRGcmFtZWZuKEhXTkQgaHduZCk7CitzdGF0aWMgTE9ORyBQYWludEljb25mbihIV05EIGh3bmQpOworCiAKIHN0YXRpYyBDT0xPUlJFRiBjb2xvcl93aW5kb3dmcmFtZSwgY29sb3JfYmFja2dyb3VuZCwgY29sb3Jfd2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl93aW5kb3d0ZXh0OwpAQCAtMzcsNyArMzksNyBAQAogICAgIHsgKExPTkcoKikoKSlQYWludFRleHRmbiB9LCAgICAgICAgICAgICAgICAgICAgLyogU1NfTEVGVCAqLwogICAgIHsgKExPTkcoKikoKSlQYWludFRleHRmbiB9LCAgICAgICAgICAgICAgICAgICAgLyogU1NfQ0VOVEVSICovCiAgICAgeyAoTE9ORygqKSgpKVBhaW50VGV4dGZuIH0sICAgICAgICAgICAgICAgICAgICAvKiBTU19SSUdIVCAqLwotICAgIHsgKExPTkcoKikoKSlOVUxMICAgICAgICB9LCAgICAgICAgICAgICAgICAgICAgLyogU1NfSUNPTiAqLworICAgIHsgKExPTkcoKikoKSlQYWludEljb25mbiB9LCAgICAgICAgICAgICAgICAgICAgLyogU1NfSUNPTiAqLwogICAgIHsgKExPTkcoKikoKSlQYWludFJlY3RmbiB9LCAgICAgICAgICAgICAgICAgICAgLyogU1NfQkxBQ0tSRUNUICovCiAgICAgeyAoTE9ORygqKSgpKVBhaW50UmVjdGZuIH0sICAgICAgICAgICAgICAgICAgICAvKiBTU19HUkFZUkVDVCAqLwogICAgIHsgKExPTkcoKikoKSlQYWludFJlY3RmbiB9LCAgICAgICAgICAgICAgICAgICAgLyogU1NfV0hJVEVSRUNUICovCkBAIC02NSwxNyArNjcsMjIgQEAKIAkgICAgYnJlYWs7CiAKIAljYXNlIFdNX0NSRUFURToKLQkgICAgaWYgKHN0eWxlIDwgMEwgfHwgc3R5bGUgPj0gKExPTkcpRElNKHN0YXRpY2ZuKSkKKwkgICAgaWYgKHN0eWxlIDwgMEwgfHwgc3R5bGUgPj0gKExPTkcpRElNKHN0YXRpY2ZuKSkgewogCQlsUmVzdWx0ID0gLTFMOwotCSAgICBlbHNlCi0JICAgIHsKLQkJLyogaW5pdGlhbGlzZSBjb2xvdXJzICovCi0JCWNvbG9yX3dpbmRvd2ZyYW1lICA9IEdldFN5c0NvbG9yKENPTE9SX1dJTkRPV0ZSQU1FKTsKLQkJY29sb3JfYmFja2dyb3VuZCAgID0gR2V0U3lzQ29sb3IoQ09MT1JfQkFDS0dST1VORCk7Ci0JCWNvbG9yX3dpbmRvdyAgICAgICA9IEdldFN5c0NvbG9yKENPTE9SX1dJTkRPVyk7Ci0JCWNvbG9yX3dpbmRvd3RleHQgICA9IEdldFN5c0NvbG9yKENPTE9SX1dJTkRPV1RFWFQpOwotCQlsUmVzdWx0ID0gMEw7Ci0JICAgIH0KKwkJYnJlYWs7CisJCX0KKwkgICAgLyogaW5pdGlhbGlzZSBjb2xvdXJzICovCisJICAgIGNvbG9yX3dpbmRvd2ZyYW1lICA9IEdldFN5c0NvbG9yKENPTE9SX1dJTkRPV0ZSQU1FKTsKKwkgICAgY29sb3JfYmFja2dyb3VuZCAgID0gR2V0U3lzQ29sb3IoQ09MT1JfQkFDS0dST1VORCk7CisJICAgIGNvbG9yX3dpbmRvdyAgICAgICA9IEdldFN5c0NvbG9yKENPTE9SX1dJTkRPVyk7CisJICAgIGNvbG9yX3dpbmRvd3RleHQgICA9IEdldFN5c0NvbG9yKENPTE9SX1dJTkRPV1RFWFQpOworCSAgICBsUmVzdWx0ID0gMEw7CisJICAgIGlmIChzdHlsZSA9PSBTU19JQ09OKSB7CisvKgorCQlTZXRXaW5kb3dQb3MoaFduZCwgKEhXTkQpTlVMTCwgMCwgMCwgMzIsIDMyLAorCQkJCVNXUF9OT1pPUkRFUiB8IFNXUF9OT01PVkUpOworKi8KKwkJfQogCSAgICBicmVhazsKIAogCWNhc2UgV01fUEFJTlQ6CkBAIC0yNTksNiArMjY2LDM1IEBACiB9CiAKIAorc3RhdGljIExPTkcgUGFpbnRJY29uZm4oSFdORCBod25kKQoreworICAgIFdORCAJKnduZFB0cjsKKyAgICBQQUlOVFNUUlVDVCBwczsKKyAgICBSRUNUIAlyYzsKKyAgICBIREMgCWhkYzsKKyAgICBMUFNUUgl0ZXh0UHRyOworICAgIEhJQ09OCWhJY29uOworCisgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCk7CisgICAgaGRjID0gQmVnaW5QYWludChod25kLCAmcHMpOworICAgIEdldENsaWVudFJlY3QoaHduZCwgJnJjKTsKKyAgICBGaWxsUmVjdChoZGMsICZyYywgR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpKTsKKyAgICB0ZXh0UHRyID0gKExQU1RSKVVTRVJfSEVBUF9BRERSKHduZFB0ci0+aFRleHQpOworICAgIHByaW50ZigiU1NfSUNPTiA6IHRleHRQdHI9JyVzJyAvIGxlZnQ9JWQgdG9wPSVkIHJpZ2h0PSVkIGJvdHRvbT0lZCBcbiIsIAorICAgIAkJdGV4dFB0ciwgcmMubGVmdCwgcmMudG9wLCByYy5yaWdodCwgcmMuYm90dG9tKTsKKy8qCisgICAgU2V0V2luZG93UG9zKGh3bmQsIChIV05EKU5VTEwsIDAsIDAsIDMyLCAzMiwKKwkJU1dQX05PWk9SREVSIHwgU1dQX05PTU9WRSk7CisgICAgR2V0Q2xpZW50UmVjdChod25kLCAmcmMpOworICAgIHByaW50ZigiU1NfSUNPTiA6IHRleHRQdHI9JyVzJyAvIGxlZnQ9JWQgdG9wPSVkIHJpZ2h0PSVkIGJvdHRvbT0lZCBcbiIsIAorICAgIAkJdGV4dFB0ciwgcmMubGVmdCwgcmMudG9wLCByYy5yaWdodCwgcmMuYm90dG9tKTsKKyovCisgICAgaEljb24gPSBMb2FkSWNvbih3bmRQdHItPmhJbnN0YW5jZSwgdGV4dFB0cik7CisgICAgRHJhd0ljb24oaGRjLCByYy5sZWZ0LCByYy50b3AsIGhJY29uKTsKKyAgICBFbmRQYWludChod25kLCAmcHMpOworICAgIEdsb2JhbFVubG9jayhod25kKTsKK30KKwogCiAKIApkaWZmIC0tZ2l0IGEvaWYxNjMyL2NhbGwuUyBiL2lmMTYzMi9jYWxsLlMKaW5kZXggOWRhODdmMC4uYzhhYzAzMCAxMDA2NDQKLS0tIGEvaWYxNjMyL2NhbGwuUworKysgYi9pZjE2MzIvY2FsbC5TCkBAIC0xNSwxMSArMTUsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKglQbGFjZXMgdG8ga2VlcCBpbmZvIGFib3V0IHRoZSBjdXJyZW50IDMyLWJpdCBzdGFjayBmcmFtZS4KICAqLwotc2F2ZWRfZXNwOgorCS5nbG9ibAlfSUYxNjMyX1NhdmVkMzJfZXNwLF9JRjE2MzJfU2F2ZWQzMl9lYnAsX0lGMTYzMl9TYXZlZDMyX3NzCitfSUYxNjMyX1NhdmVkMzJfZXNwOgogCS5sb25nCTAKLXNhdmVkX2VicDoKK19JRjE2MzJfU2F2ZWQzMl9lYnA6CiAJLmxvbmcJMAotc2F2ZWRfc3M6CitfSUYxNjMyX1NhdmVkMzJfc3M6CiAJLndvcmQJMAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjQsOSArNjUsOSBAQAogIAkgKiBTYXZlIG91ciByZWdpc3RlcnMKIAkgKi8KIAlwdXNoYWwKLQlwdXNobAlzYXZlZF9lc3AKLQlwdXNobAlzYXZlZF9lYnAKLQlwdXNodwlzYXZlZF9zcworCXB1c2hsCV9JRjE2MzJfU2F2ZWQzMl9lc3AKKwlwdXNobAlfSUYxNjMyX1NhdmVkMzJfZWJwCisJcHVzaHcJX0lGMTYzMl9TYXZlZDMyX3NzCiAKIAkvKgogCSAqIEdldCB0YXJnZXQgYWRkcmVzcy4KQEAgLTc4LDkgKzc5LDkgQEAKIAkvKgogCSAqIFB1dCBzdGFjayByZWdpc3RlcnMgd2hlcmUgd2UgY2FuIGdldCB0aGVtIGFmdGVyIHN0YWNrIHN3aXRjaC4KIAkgKi8KLQltb3Z3CSVzcyxzYXZlZF9zcwotCW1vdmwJJWVzcCxzYXZlZF9lc3AKLQltb3ZsCSVlYnAsc2F2ZWRfZWJwCisJbW92dwklc3MsX0lGMTYzMl9TYXZlZDMyX3NzCisJbW92bAklZXNwLF9JRjE2MzJfU2F2ZWQzMl9lc3AKKwltb3ZsCSVlYnAsX0lGMTYzMl9TYXZlZDMyX2VicAogCiAJLyoKIAkgKiBMb2FkIGluaXRpYWwgcmVnaXN0ZXJzCkBAIC0xMzAsMTYgKzEzMSwxNiBAQAogCW1vdncJJWF4LCVmcwogCW1vdncJJWF4LCVncwogCXBvcGwJJWVheAotCW1vdncJc2F2ZWRfc3MsJXNzCi0JbW92bAlzYXZlZF9lc3AsJWVzcAotCW1vdmwJc2F2ZWRfZWJwLCVlYnAKKwltb3Z3CV9JRjE2MzJfU2F2ZWQzMl9zcywlc3MKKwltb3ZsCV9JRjE2MzJfU2F2ZWQzMl9lc3AsJWVzcAorCW1vdmwJX0lGMTYzMl9TYXZlZDMyX2VicCwlZWJwCiAKIAkvKgogIAkgKiBSZXN0b3JlIHJlZ2lzdGVycywgYnV0IGRvIG5vdCBkZXN0cm95IHJldHVybiB2YWx1ZS4KIAkgKi8KLQlwb3B3CXNhdmVkX3NzCi0JcG9wbAlzYXZlZF9lYnAKLQlwb3BsCXNhdmVkX2VzcAorCXBvcHcJX0lGMTYzMl9TYXZlZDMyX3NzCisJcG9wbAlfSUYxNjMyX1NhdmVkMzJfZWJwCisJcG9wbAlfSUYxNjMyX1NhdmVkMzJfZXNwCiAJbW92bAklZWF4LHJldHVybl92YWx1ZQogCXBvcGFsCiAJbW92bAlyZXR1cm5fdmFsdWUsJWVheApAQCAtMTczLDEzICsxNzQsMTMgQEAKIAkvKgogCSAqIFN3aXRjaCB0byAxNi1iaXQgc3RhY2sKIAkgKi8KLQlwdXNobAlzYXZlZF9lc3AKLQlwdXNobAlzYXZlZF9lYnAKLQlwdXNodwlzYXZlZF9zcworCXB1c2hsCV9JRjE2MzJfU2F2ZWQzMl9lc3AKKwlwdXNobAlfSUYxNjMyX1NhdmVkMzJfZWJwCisJcHVzaHcJX0lGMTYzMl9TYXZlZDMyX3NzCiAKLQltb3Z3CSVzcyxzYXZlZF9zcwotCW1vdmwJJWVzcCxzYXZlZF9lc3AKLQltb3ZsCSVlYnAsc2F2ZWRfZWJwCisJbW92dwklc3MsX0lGMTYzMl9TYXZlZDMyX3NzCisJbW92bAklZXNwLF9JRjE2MzJfU2F2ZWQzMl9lc3AKKwltb3ZsCSVlYnAsX0lGMTYzMl9TYXZlZDMyX2VicAogCiAJbW92dwlfSUYxNjMyX1NhdmVkMTZfc3MsJXNzCiAJbW92bAlfSUYxNjMyX1NhdmVkMTZfZXNwLCVlc3AKQEAgLTIxNSwxMyArMjE2LDEzIEBACiAJbW92bAklZXNwLF9JRjE2MzJfU2F2ZWQxNl9lc3AKIAltb3ZsCSVlYnAsX0lGMTYzMl9TYXZlZDE2X2VicAogCi0JbW92dwlzYXZlZF9zcywlc3MKLQltb3ZsCXNhdmVkX2VzcCwlZXNwCi0JbW92bAlzYXZlZF9lYnAsJWVicAorCW1vdncJX0lGMTYzMl9TYXZlZDMyX3NzLCVzcworCW1vdmwJX0lGMTYzMl9TYXZlZDMyX2VzcCwlZXNwCisJbW92bAlfSUYxNjMyX1NhdmVkMzJfZWJwLCVlYnAKIAotCXBvcHcJc2F2ZWRfc3MKLQlwb3BsCXNhdmVkX2VicAotCXBvcGwJc2F2ZWRfZXNwCisJcG9wdwlfSUYxNjMyX1NhdmVkMzJfc3MKKwlwb3BsCV9JRjE2MzJfU2F2ZWQzMl9lYnAKKwlwb3BsCV9JRjE2MzJfU2F2ZWQzMl9lc3AKIAogCW1vdmwJJWVheCxyZXR1cm5fdmFsdWUKIAltb3Z3CXJldHVybl92YWx1ZSsyLCVkeApAQCAtMjc2LDkgKzI3Nyw5IEBACiAJbW92bAklZXNwLF9JRjE2MzJfU2F2ZWQxNl9lc3AKIAltb3ZsCSVlYnAsX0lGMTYzMl9TYXZlZDE2X2VicAogCi0JbW92dwlzYXZlZF9zcywlc3MKLQltb3ZsCXNhdmVkX2VzcCwlZXNwCi0JbW92bAlzYXZlZF9lYnAsJWVicAorCW1vdncJX0lGMTYzMl9TYXZlZDMyX3NzLCVzcworCW1vdmwJX0lGMTYzMl9TYXZlZDMyX2VzcCwlZXNwCisJbW92bAlfSUYxNjMyX1NhdmVkMzJfZWJwLCVlYnAKIAogCS8qCiAJICogQ2FsbCBlbnRyeSBwb2ludApkaWZmIC0tZ2l0IGEvaWYxNjMyL2NhbGxiYWNrLmMgYi9pZjE2MzIvY2FsbGJhY2suYwppbmRleCA2MGE5ZTg4Li4xODUyMTg1IDEwMDY0NAotLS0gYS9pZjE2MzIvY2FsbGJhY2suYworKysgYi9pZjE2MzIvY2FsbGJhY2suYwpAQCAtNSwxMCArNSwxNiBAQAogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAid2luZS5oIgogI2luY2x1ZGUgInNlZ21lbS5oIgorI2luY2x1ZGUgPHNldGptcC5oPgogCiBleHRlcm4gdW5zaWduZWQgc2hvcnQgU2VsZWN0b3JPd25lcnNbXTsKIGV4dGVybiB1bnNpZ25lZCBzaG9ydCBJRjE2MzJfU2F2ZWQxNl9zczsKK2V4dGVybiB1bnNpZ25lZCBsb25nICBJRjE2MzJfU2F2ZWQxNl9lYnA7CiBleHRlcm4gdW5zaWduZWQgbG9uZyAgSUYxNjMyX1NhdmVkMTZfZXNwOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IElGMTYzMl9TYXZlZDMyX3NzOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgIElGMTYzMl9TYXZlZDMyX2VicDsKK2V4dGVybiB1bnNpZ25lZCBsb25nICBJRjE2MzJfU2F2ZWQzMl9lc3A7CisKIGV4dGVybiBzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yX3MgKk1ha2VQcm9jVGh1bmtzOwogCiBzdHJ1Y3QgdGh1bmtfcwpAQCAtMTY5LDMgKzE3NSw3NyBAQAogCSgqZnVuYykoeFBvcywgeVBvcywgbFBhcmFtKTsKICAgICB9CiB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHJlYWxpemUgdGhlIENhdGNoL1Rocm93IGZ1bmN0aW9uYWxpdHkuCisgKiBNeSB0aG91Z2h0IGlzIHRvIHVzZSB0aGUgc2V0am1wLCBsb25nam1wIGNvbWJpbmF0aW9uIHRvIGRvIHRoZQorICogbWFqb3IgcGFydCBvZiB0aGlzIG9uZS4gQWxsIEkgaGF2ZSB0byByZW1lbWJlciwgaW4gYWRkaXRpb24gdG8KKyAqIHdoYXRldmVyIHRoZSBqbXBfYnVmIGNvbnRhaW5zLCBpcyB0aGUgY29udGVudHMgb2YgdGhlIDE2LWJpdAorICogc3AsIGJwIGFuZCBzcy4gSSBkbyB0aGlzIGJ5IHN0b3JpbmcgdGhlbSBpbiB0aGUgc3RydWN0dXJlIHBhc3NlZAorICogdG8gbWUgYnkgdGhlIDE2LWJpdCBwcm9ncmFtIChpbmNsdWRpbmcgbXkgb3duIGptcF9idWYuLi4pLiAKKyAqIEhvcGVmdWxseSB0aGVyZSBpc24ndCBhbnkgcHJvZ3JhbSB0aGF0IG1vZGlmaWVzIHRoZSBjb250ZW50cyEKKyAqIEJhZCB0aGluZzogSSBoYXZlIHRvIHNhdmUgcGFydCBvZiB0aGUgc3RhY2ssIHNpbmNlIHRoaXMgd2lsbCAKKyAqIGdldCByZXVzZWQgb24gdGhlIG5leHQgY2FsbCBhZnRlciBteSByZXR1cm4sIGxlYXZpbmcgaXQgaW4gYW4KKyAqIHVuZGVmaW5lZCBzdGF0ZS4KKyAqLworI2RlZmluZQlTVEFDS19ERVBUSF8xNiAJMjgKKworc3RydWN0IHNwZWNpYWxfYnVmZmVyIHsKKwlqbXBfYnVmIGJ1ZmZlcjsKKwlsb25nIAlyZWdzIFs2XTsKKwljaGFyIAlzdGFja19wYXJ0IFtTVEFDS19ERVBUSF8xNl07Cit9ICpzYjsKKworaW50IENhdGNoIChMUENBVENIQlVGIGNidWYpCit7CisJV09SRCByZXR2YWw7CisJam1wX2J1ZiAqdG1wX2ptcDsKKwljaGFyICpzdGFjazE2ID0gIChjaGFyICopICgoKHVuc2lnbmVkIGludClJRjE2MzJfU2F2ZWQxNl9zcyA8PCAxNikgKworCQkoSUYxNjMyX1NhdmVkMTZfZXNwICYgMHhmZmZmKSk7CisKKwlzYiA9IG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3BlY2lhbF9idWZmZXIpKTsKKwkKKwlzYiAtPiByZWdzIFswXSA9IElGMTYzMl9TYXZlZDE2X2VzcDsKKwlzYiAtPiByZWdzIFsxXSA9IElGMTYzMl9TYXZlZDE2X2VicDsKKwlzYiAtPiByZWdzIFsyXSA9IElGMTYzMl9TYXZlZDE2X3NzICYgMHhmZmZmOworCXNiIC0+IHJlZ3MgWzNdID0gSUYxNjMyX1NhdmVkMzJfZXNwOworCXNiIC0+IHJlZ3MgWzRdID0gSUYxNjMyX1NhdmVkMzJfZWJwOworCXNiIC0+IHJlZ3MgWzVdID0gSUYxNjMyX1NhdmVkMzJfc3MgJiAweGZmZmY7CisJbWVtY3B5IChzYiAtPiBzdGFja19wYXJ0LCBzdGFjazE2LCBTVEFDS19ERVBUSF8xNik7CisJdG1wX2ptcCA9ICZzYiAtPiBidWZmZXI7CisJKigoc3RydWN0IHNwZWNpYWxfYnVmZmVyICoqKWNidWYpID0gc2I7CisJCisJaWYgKChyZXR2YWwgPSBzZXRqbXAgKCp0bXBfam1wKSkpCisJeworCQlJRjE2MzJfU2F2ZWQxNl9lc3AgPSBzYiAtPiByZWdzIFswXTsKKwkJSUYxNjMyX1NhdmVkMTZfZWJwID0gc2IgLT4gcmVncyBbMV07CisJCUlGMTYzMl9TYXZlZDE2X3NzID0gc2IgLT4gcmVncyBbMl0gJiAweGZmZmY7CisJCUlGMTYzMl9TYXZlZDMyX2VzcCA9IHNiIC0+IHJlZ3MgWzNdOworCQlJRjE2MzJfU2F2ZWQzMl9lYnAgPSBzYiAtPiByZWdzIFs0XTsKKwkJSUYxNjMyX1NhdmVkMzJfc3MgPSBzYiAtPiByZWdzIFs1XSAmIDB4ZmZmZjsKKwkJc3RhY2sxNiA9IChjaGFyICopICgoKHVuc2lnbmVkIGludClJRjE2MzJfU2F2ZWQxNl9zcyA8PCAxNikgKworCQkJCShJRjE2MzJfU2F2ZWQxNl9lc3AgJiAweGZmZmYpKTsKKworCQltZW1jcHkgKHN0YWNrMTYsIHNiIC0+IHN0YWNrX3BhcnQsIFNUQUNLX0RFUFRIXzE2KTsKKyNpZmRlZglERUJVR19DQVRDSAorCQlwcmludGYgKCJCZWVuIHRocm93biBoZXJlOiAlZCwgcmV0dmFsID0gJWRcbiIsIHNiLCByZXR2YWwpOworI2VuZGlmCisJCWZyZWUgKCh2b2lkICopIHNiKTsKKwkJcmV0dXJuIChyZXR2YWwpOworCX0gZWxzZSB7CisjaWZkZWYJREVCVUdfQ0FUQ0gKKwkJcHJpbnRmICgiV2lsbCBzb210aW1lIGdldCB0aHJvd24gaGVyZTogJWRcbiIsIHNiKTsKKyNlbmRpZgorCQlyZXR1cm4gKHJldHZhbCk7CisJfQorfQorCit2b2lkIFRocm93IChMUENBVENIQlVGIGNidWYsIGludCB2YWwpCit7CisJc2IgPSAqKChzdHJ1Y3Qgc3BlY2lhbF9idWZmZXIgKiopY2J1Zik7CisjaWZkZWYJREVCVUdfQ0FUQ0gKKwlwcmludGYgKCJUaHJvd2luZyB0bzogJWRcbiIsIHNiKTsKKyNlbmRpZgorCWxvbmdqbXAgKHNiIC0+IGJ1ZmZlciwgdmFsKTsKK30KZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwuc3BlYyBiL2lmMTYzMi9rZXJuZWwuc3BlYwppbmRleCA3NTVmODQzLi4xNDJmNDUxIDEwMDY0NAotLS0gYS9pZjE2MzIva2VybmVsLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbC5zcGVjCkBAIC0zMiwxMSArMzIsMTQgQEAKIDUwICBwYXNjYWwgR2V0UHJvY0FkZHJlc3Mod29yZCBwdHIpIEdldFByb2NBZGRyZXNzKDEgMikKIDUxICBwYXNjYWwgTWFrZVByb2NJbnN0YW5jZShwdHIgd29yZCkgQ0FMTEJBQ0tfTWFrZVByb2NJbnN0YW5jZSgxIDIpCiA1MiAgcGFzY2FsIEZyZWVQcm9jSW5zdGFuY2UocHRyKSBGcmVlUHJvY0luc3RhbmNlKDEpCis1NSAgcGFzY2FsIENhdGNoKHB0cikgQ2F0Y2ggKDEpCis1NiAgcGFzY2FsIFRocm93KHB0ciB3b3JkKSBUaHJvdygxIDIpCiA1OSAgcGFzY2FsIFdyaXRlUHJvZmlsZVN0cmluZyhwdHIgcHRyIHB0cikgV3JpdGVQcm9maWxlU3RyaW5nKDEgMiAzKQogNjAgIHBhc2NhbCBGaW5kUmVzb3VyY2Uod29yZCBwdHIgcHRyKSBGaW5kUmVzb3VyY2UoMSAyIDMpCiA2MSAgcGFzY2FsIExvYWRSZXNvdXJjZSh3b3JkIHdvcmQpIExvYWRSZXNvdXJjZSgxIDIpCiA2MiAgcGFzY2FsIExvY2tSZXNvdXJjZSh3b3JkKSBMb2NrUmVzb3VyY2UoMSkKIDYzICBwYXNjYWwgRnJlZVJlc291cmNlKHdvcmQpIEZyZWVSZXNvdXJjZSgxKQorNjQgIHBhc2NhbCBBY2Nlc3NSZXNvdXJjZSh3b3JkIHdvcmQpIEFjY2Vzc1Jlc291cmNlKDEgMikKIDc0ICBwYXNjYWwgT3BlbkZpbGUocHRyIHB0ciB3b3JkKSBLRVJORUxfT3BlbkZpbGUoMSAyIDMpCiA4MSAgcGFzY2FsIF9sY2xvc2Uod29yZCkgS0VSTkVMX19sY2xvc2UoMSkKIDgyICBwYXNjYWwgX2xyZWFkKHdvcmQgcHRyIHdvcmQpIEtFUk5FTF9fbHJlYWQoMSAyIDMpCkBAIC00OCw2ICs1MSw4IEBACiA5MSAgcmVnaXN0ZXIgSW5pdFRhc2sod29yZCB3b3JkIHdvcmQgd29yZCB3b3JkCiAJCSAgICAgIHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCkgCiAJICAgICBLRVJORUxfSW5pdFRhc2soKQorOTUgIHBhc2NhbCBMb2FkTGlicmFyeShwdHIpIExvYWRMaWJyYXJ5KDEpCis5NiAgcGFzY2FsIEZyZWVMaWJyYXJ5KHdvcmQpIEZyZWVMaWJyYXJ5KDEpCiAxMDIgcmVnaXN0ZXIgRE9TM0NhbGwod29yZCB3b3JkIHdvcmQgd29yZCB3b3JkCiAJCSAgICAgIHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCkgCiAJICAgICBLRVJORUxfRE9TM0NhbGwoKQpAQCAtNjcsNiArNzIsMTEgQEAKIDE2MyBwYXNjYWwgR2xvYmFsTFJVT2xkZXN0KHdvcmQpIFJldHVybkFyZygxKQogMTY0IHBhc2NhbCBHbG9iYWxMUlVOZXdlc3Qod29yZCkgUmV0dXJuQXJnKDEpCiAxNjYgcGFzY2FsIFdpbkV4ZWMocHRyIHdvcmQpIFdpbkV4ZWMoMSAyKQorMTcwIHBhc2NhbCBBbGxvY0NTdG9EU0FsaWFzKHdvcmQpIEFsbG9jRFN0b0NTQWxpYXMoMSkKKzE3MSBwYXNjYWwgQWxsb2NEU3RvQ1NBbGlhcyh3b3JkKSBBbGxvY0RTdG9DU0FsaWFzKDEpCisxNzUgcGFzY2FsIEFsbG9jU2VsZWN0b3Iod29yZCkgQWxsb2NTZWxlY3RvcigxKQorMTc2IHBhc2NhbCBGcmVlU2VsZWN0b3Iod29yZCkgRnJlZVNlbGVjdG9yKDEpCisxNzcgcGFzY2FsIFByZXN0b0NoYW5nb1NlbGVjdG9yKHdvcmQgd29yZCkgUHJlc3RvQ2hhbmdvU2VsZWN0b3IoMSAyKQogMTc4IGVxdWF0ZSBfX1dJTkZMQUdTIDB4NDEzCiAxODQgcmV0dXJuIEdsb2JhbERPU0FsbG9jIDQgMAogMTg1IHJldHVybiBHbG9iYWxET1NGcmVlIDIgMApkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5LmMgYi9pZjE2MzIvcmVsYXkuYwppbmRleCA5YmY2YjEyLi44NTkxNDRjIDEwMDY0NAotLS0gYS9pZjE2MzIvcmVsYXkuYworKysgYi9pZjE2MzIvcmVsYXkuYwpAQCAtMTY2LDEwICsxNjYsMTcgQEAKIAkgICAgYnJlYWs7CiAJICAgIAogCSAgY2FzZSBETExfQVJHVFlQRV9MT05HOgotCSAgY2FzZSBETExfQVJHVFlQRV9GQVJQVFI6CiAJICAgIGlwID0gKGludCAqKSAoKGNoYXIgKikgYXJnX3B0ciArIG9mZnNldCk7CiAJICAgIGFyZ190YWJsZVtpXSA9ICppcDsKIAkgICAgYnJlYWs7CisKKwkgIGNhc2UgRExMX0FSR1RZUEVfRkFSUFRSOgorCSAgICBpcCA9IChpbnQgKikgKChjaGFyICopIGFyZ19wdHIgKyBvZmZzZXQpOworCSAgICBpZiAoKmlwICYgMHhmZmZmMDAwMCkKKwkJYXJnX3RhYmxlW2ldID0gU0FGRU1BS0VQVFIoKHVuc2lnbmVkKSAqaXAgPj4gMTYsICppcCk7CisJICAgIGVsc2UKKwkJYXJnX3RhYmxlW2ldID0gKmlwOworCSAgICBicmVhazsKIAl9CiAgICAgfQogCmRpZmYgLS1naXQgYS9pZjE2MzIvdXNlci5zcGVjIGIvaWYxNjMyL3VzZXIuc3BlYwppbmRleCA5ZjkyYmQ4Li5iZjAzMmQ2IDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlci5zcGVjCisrKyBiL2lmMTYzMi91c2VyLnNwZWMKQEAgLTE1LDYgKzE1LDggQEAKIDE1ICBwYXNjYWwgR2V0Q3VycmVudFRpbWUoKSBHZXRUaWNrQ291bnQoKQogMTggIHBhc2NhbCBTZXRDYXB0dXJlKHdvcmQpIFNldENhcHR1cmUoMSkKIDE5ICBwYXNjYWwgUmVsZWFzZUNhcHR1cmUoKSBSZWxlYXNlQ2FwdHVyZSgpCisyMCAgcGFzY2FsIFNldERvdWJsZUNsaWNrVGltZSh3b3JkKSBTZXREb3VibGVDbGlja1RpbWUoMSkKKzIxICBwYXNjYWwgR2V0RG91YmxlQ2xpY2tUaW1lKCkgR2V0RG91YmxlQ2xpY2tUaW1lKCkKIDIyICBwYXNjYWwgU2V0Rm9jdXMod29yZCkgU2V0Rm9jdXMoMSkKIDIzICBwYXNjYWwgR2V0Rm9jdXMoKSBHZXRGb2N1cygpCiAzMSAgcGFzY2FsIElzSWNvbmljKHdvcmQpIElzSWNvbmljKDEpCkBAIC0yOCwxNiArMzAsMjQgQEAKIDQxICBwYXNjYWwgQ3JlYXRlV2luZG93KHB0ciBwdHIgbG9uZyBzX3dvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgd29yZCB3b3JkIHdvcmQgcHRyKSAKIAkgICBDcmVhdGVXaW5kb3coMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEpCiA0MiAgcGFzY2FsIFNob3dXaW5kb3cod29yZCB3b3JkKSBTaG93V2luZG93KDEgMikKKzQzICBwYXNjYWwgQ2xvc2VXaW5kb3cod29yZCkgQ2xvc2VXaW5kb3coMSkKKzQ0ICBwYXNjYWwgT3Blbkljb24od29yZCkgT3Blbkljb24oMSkKIDQ2ICBwYXNjYWwgR2V0UGFyZW50KHdvcmQpIEdldFBhcmVudCgxKQorNDcgIHBhc2NhbCBJc1dpbmRvdyh3b3JkKSBJc1dpbmRvdygxKQogNDggIHBhc2NhbCBJc0NoaWxkKHdvcmQgd29yZCkgSXNDaGlsZCgxIDIpCis0OSAgcGFzY2FsIElzV2luZG93VmlzaWJsZSh3b3JkKSBJc1dpbmRvd1Zpc2libGUoMSkKKzUwICBwYXNjYWwgRmluZFdpbmRvdyhwdHIgcHRyKSBGaW5kV2luZG93KDEgMikKIDUzICBwYXNjYWwgRGVzdHJveVdpbmRvdyh3b3JkKSBEZXN0cm95V2luZG93KDEpCiA1NiAgcGFzY2FsIE1vdmVXaW5kb3cod29yZCB3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQpIAogICAgICAgICAgICBNb3ZlV2luZG93KDEgMiAzIDQgNSA2KQogNTcgIHBhc2NhbCBSZWdpc3RlckNsYXNzKHB0cikgUmVnaXN0ZXJDbGFzcygxKQorNjEgIHBhc2NhbCBTY3JvbGxXaW5kb3cod29yZCBzX3dvcmQgc193b3JkIHB0ciBwdHIpIFNjcm9sbFdpbmRvdygxIDIgMyA0IDUpCiA2MiAgcGFzY2FsIFNldFNjcm9sbFBvcyh3b3JkIHdvcmQgd29yZCB3b3JkKSBTZXRTY3JvbGxQb3MoMSAyIDMgNCkKIDY0ICBwYXNjYWwgU2V0U2Nyb2xsUmFuZ2Uod29yZCB3b3JkIHdvcmQgd29yZCB3b3JkKSBTZXRTY3JvbGxSYW5nZSgxIDIgMyA0IDUpCiA2NiAgcGFzY2FsIEdldERDKHdvcmQpIEdldERDKDEpCiA2OCAgcGFzY2FsIFJlbGVhc2VEQyh3b3JkIHdvcmQpIFJlbGVhc2VEQygxIDIpCis2OSAgcGFzY2FsIFNldEN1cnNvcih3b3JkIHdvcmQpIFNldEN1cnNvcigxIDIpCis3MSAgcGFzY2FsIFNob3dDdXJzb3Iod29yZCB3b3JkKSBTaG93Q3Vyc29yKDEgMikKIDcyICBwYXNjYWwgU2V0UmVjdChwdHIgc193b3JkIHNfd29yZCBzX3dvcmQgc193b3JkKSBTZXRSZWN0KDEgMiAzIDQgNSkKIDczICBwYXNjYWwgU2V0UmVjdEVtcHR5KHB0cikgU2V0UmVjdEVtcHR5KDEpCiA3NCAgcGFzY2FsIENvcHlSZWN0KHB0ciBwdHIpIENvcHlSZWN0KDEgMikKQEAgLTUwLDYgKzYwLDcgQEAKIDgxICBwYXNjYWwgRmlsbFJlY3Qod29yZCBwdHIgd29yZCkgRmlsbFJlY3QoMSAyIDMpCiA4MiAgcGFzY2FsIEludmVydFJlY3Qod29yZCBwdHIpIEludmVydFJlY3QoMSAyKQogODMgIHBhc2NhbCBGcmFtZVJlY3Qod29yZCBwdHIgd29yZCkgRnJhbWVSZWN0KDEgMiAzKQorODQgIHBhc2NhbCBEcmF3SWNvbih3b3JkIHNfd29yZCBzX3dvcmQgd29yZCkgRHJhd0ljb24oMSAyIDMgNCkKIDg1ICBwYXNjYWwgRHJhd1RleHQod29yZCBwdHIgc193b3JkIHB0ciB3b3JkKSBEcmF3VGV4dCgxIDIgMyA0IDUpCiA4NyAgcGFzY2FsIERpYWxvZ0JveCh3b3JkIHB0ciB3b3JkIHB0cikgRGlhbG9nQm94KDEgMiAzIDQpCiA4OCAgcGFzY2FsIEVuZERpYWxvZyh3b3JkIHNfd29yZCkgRW5kRGlhbG9nKDEgMikKQEAgLTEwOSw4ICsxMjAsMTEgQEAKIDE4MSBwYXNjYWwgU2V0U3lzQ29sb3JzKHdvcmQgcHRyIHB0cikgU2V0U3lzQ29sb3JzKDEgMiAzKQogMTgyIHBhc2NhbCBLaWxsU3lzdGVtVGltZXIod29yZCB3b3JkKSBLaWxsU3lzdGVtVGltZXIoMSAyKQogMTkwIHBhc2NhbCBHZXRVcGRhdGVSZWN0KHdvcmQgcHRyIHdvcmQpIEdldFVwZGF0ZVJlY3QoMSAyIDMpCisyMTggcGFzY2FsIERpYWxvZ0JveEluZGlyZWN0KHdvcmQgd29yZCB3b3JkIHB0cikgRGlhbG9nQm94SW5kaXJlY3QoMSAyIDMgNCkKIDIxOSBwYXNjYWwgQ3JlYXRlRGlhbG9nSW5kaXJlY3Qod29yZCBwdHIgd29yZCBwdHIpCiAJICAgQ3JlYXRlRGlhbG9nSW5kaXJlY3QoMSAyIDMgNCkKKzIyMSBwYXNjYWwgU2Nyb2xsREMod29yZCBzX3dvcmQgc193b3JkIHB0ciBwdHIgd29yZCBwdHIpIAorCSAgIFNjcm9sbERDKDEgMiAzIDQgNSA2IDcpCiAyMjcgcGFzY2FsIEdldE5leHREbGdHcm91cEl0ZW0od29yZCB3b3JkIHdvcmQpIEdldE5leHREbGdHcm91cEl0ZW0oMSAyIDMpCiAyMjggcGFzY2FsIEdldE5leHREbGdUYWJJdGVtKHdvcmQgd29yZCB3b3JkKSBHZXROZXh0RGxnVGFiSXRlbSgxIDIgMykKIDIyOSBwYXNjYWwgR2V0VG9wV2luZG93KHdvcmQpIEdldFRvcFdpbmRvdygxKQpAQCAtMTE4LDYgKzEzMiw5IEBACiAyMzIgcGFzY2FsIFNldFdpbmRvd1Bvcyh3b3JkIHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCB3b3JkKSAKICAgICAgICAgICAgU2V0V2luZG93UG9zKDEgMiAzIDQgNSA2IDcpCiAyMzcgcGFzY2FsIEdldFVwZGF0ZVJnbih3b3JkIHdvcmQgd29yZCkgR2V0VXBkYXRlUmduKDEgMiAzKQorMjM5IHBhc2NhbCBEaWFsb2dCb3hQYXJhbSh3b3JkIHB0ciB3b3JkIHB0ciBsb25nKSBEaWFsb2dCb3hQYXJhbSgxIDIgMyA0IDUpCisyNDAgcGFzY2FsIERpYWxvZ0JveEluZGlyZWN0UGFyYW0od29yZCB3b3JkIHdvcmQgcHRyIGxvbmcpCisJICAgRGlhbG9nQm94SW5kaXJlY3RQYXJhbSgxIDIgMyA0IDUpCiAyNDEgcGFzY2FsIENyZWF0ZURpYWxvZ1BhcmFtKHdvcmQgcHRyIHdvcmQgcHRyIGxvbmcpCiAJICAgQ3JlYXRlRGlhbG9nUGFyYW0oMSAyIDMgNCA1KQogMjQyIHBhc2NhbCBDcmVhdGVEaWFsb2dJbmRpcmVjdFBhcmFtKHdvcmQgcHRyIHdvcmQgcHRyIGxvbmcpCkBAIC0xMjgsNiArMTQ1LDggQEAKIDI3NyBwYXNjYWwgR2V0RGxnQ3RybElEKHdvcmQpIEdldERsZ0N0cmxJRCgxKQogMjg2IHBhc2NhbCBHZXREZXNrdG9wV2luZG93KCkgR2V0RGVza3RvcFdpbmRvdygpCiAyODggcGFzY2FsIEdldE1lc3NhZ2VFeHRyYUluZm8oKSBHZXRNZXNzYWdlRXh0cmFJbmZvKCkKKzMxOSBwYXNjYWwgU2Nyb2xsV2luZG93RXgod29yZCBzX3dvcmQgc193b3JkIHB0ciBwdHIgd29yZCBwdHIgd29yZCkgCisJICAgU2Nyb2xsV2luZG93RXgoMSAyIDMgNCA1IDYgNyA4KQogMzI0IHBhc2NhbCBGaWxsV2luZG93KHdvcmQgd29yZCB3b3JkIHdvcmQpIEZpbGxXaW5kb3coMSAyIDMgNCkKIDMyNSBwYXNjYWwgUGFpbnRSZWN0KHdvcmQgd29yZCB3b3JkIHdvcmQgcHRyKSBQYWludFJlY3QoMSAyIDMgNCA1KQogMzM0IHBhc2NhbCBHZXRRdWV1ZVN0YXR1cyh3b3JkKSBHZXRRdWV1ZVN0YXR1cygxKQpAQCAtMTQ5LDYgKzE2OCw4IEBACiA0NTIgcGFzY2FsIENyZWF0ZVdpbmRvd0V4KGxvbmcgcHRyIHB0ciBsb25nIHNfd29yZCBzX3dvcmQgc193b3JkIHNfd29yZCAKIAkgICAgICAgICAgICAgICAgICB3b3JkIHdvcmQgd29yZCBwdHIpIAogCSAgIENyZWF0ZVdpbmRvd0V4KDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEyKQorNDU3IHBhc2NhbCBEZXN0cm95SWNvbih3b3JkKSBEZXN0cm95SWNvbigxKQorNDU4IHBhc2NhbCBEZXN0cm95Q3Vyc29yKHdvcmQpIERlc3Ryb3lDdXJzb3IoMSkKIDQ3MSBwYXNjYWwgbHN0cmNtcGkocHRyIHB0cikgbHN0cmNtcGkoMSAyKQogNDcyIHBhc2NhbCBBbnNpTmV4dChwdHIpIEFuc2lOZXh0KDEgKQogNDczIHBhc2NhbCBBbnNpUHJldihwdHIgcHRyKSBBbnNpUHJldigxIDIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2N1cnNvci5oIGIvaW5jbHVkZS9jdXJzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzBkZjkwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9jdXJzb3IuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogc3RydWN0dXJlIGRlZmluaXRpb25zIGZvciBDVVJTT1IKKyAqCisgKiBDb3B5cmlnaHQgIE1hcnRpbiBBeW90dGUsIDE5OTMKKyAqCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUJV2lkdGg7CisJQllURQlSZXNlcnZlZDE7CisJQllURQlIZWlnaHQ7CisJQllURQlSZXNlcnZlZDI7CisJV09SRAljdXJYSG90c3BvdDsKKwlXT1JECWN1cllIb3RzcG90OworCURXT1JECWN1ckRJQlNpemU7CisJRFdPUkQJY3VyRElCT2Zmc2V0OworCX0gQ1VSU09SREVTQ1JJUDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUNVUlNPUkRFU0NSSVAJZGVzY3JpcHRvcjsKKwlIQklUTUFQCQloQml0bWFwOworCURpc3BsYXkJCSpkaXNwbGF5OworCVBpeG1hcAkJcGl4c2hhcGU7CisJUGl4bWFwCQlwaXhtYXNrOworCUN1cnNvcgkJeGN1cnNvcjsKKwl9IENVUlNPUkFMTE9DOworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RpYWxvZy5oIGIvaW5jbHVkZS9kaWFsb2cuaAppbmRleCAxOTBjOGM5Li40Y2ZkZGJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RpYWxvZy5oCisrKyBiL2luY2x1ZGUvZGlhbG9nLmgKQEAgLTU0LDE1ICs1NCw2IEBACiB9IERMR0NPTlRST0xIRUFERVI7CiAKIAotICAvKiBEaWFsb2cgY29udHJvbCBkYXRhICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIERMR0NPTlRST0xIRUFERVIgKiBoZWFkZXI7Ci0gICAgTFBTVFIgICAgICAgICAgICAgIGNsYXNzOwotICAgIExQU1RSICAgICAgICAgICAgICB0ZXh0OwotfSBETEdDT05UUk9MOwotCi0KICAgLyogRGlhbG9nIHRlbXBsYXRlICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtNzIsNyArNjMsNiBAQAogICAgIExQU1RSICAgICAgICAgICAgICAgY2FwdGlvbjsKICAgICBXT1JEICAgICAgICAgICAgICAgIHBvaW50U2l6ZTsKICAgICBMUFNUUiAgICAgICAgICAgICAgIGZhY2VOYW1lOwotICAgIERMR0NPTlRST0wgKiAgICAgICAgY29udHJvbHM7CiB9IERMR1RFTVBMQVRFOwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvaWNvbi5oIGIvaW5jbHVkZS9pY29uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzOGE2MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvaWNvbi5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIElDT04KKyAqCisgKiBDb3B5cmlnaHQgIE1hcnRpbiBBeW90dGUsIDE5OTMKKyAqCisgKi8KKworCit0eXBlZGVmIHN0cnVjdCB7CisJQllURQlXaWR0aDsKKwlCWVRFCUhlaWdodDsKKwlCWVRFCUNvbG9yQ291bnQ7CisJQllURQlSZXNlcnZlZDE7CisJV09SRAlSZXNlcnZlZDI7CisJV09SRAlSZXNlcnZlZDM7CisJRFdPUkQJaWNvRElCU2l6ZTsKKwlEV09SRAlpY29ESUJPZmZzZXQ7CisJfSBJQ09OREVTQ1JJUDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUlDT05ERVNDUklQCWRlc2NyaXB0b3I7CisJSEJJVE1BUAkJaEJpdG1hcDsKKwlIQklUTUFQCQloQml0TWFzazsKKwl9IElDT05BTExPQzsKKworCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NlZ21lbS5oIGIvaW5jbHVkZS9zZWdtZW0uaAppbmRleCA2YzRmN2M1Li5lYTlmODUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NlZ21lbS5oCisrKyBiL2luY2x1ZGUvc2VnbWVtLmgKQEAgLTcsNiArNywxOSBAQAogI2RlZmluZSBTRUdNRU1fSAogCiAvKgorICogQXJyYXkgdG8gdHJhY2sgc2VsZWN0b3IgYWxsb2NhdGlvbi4KKyAqLworI2RlZmluZSBNQVhfU0VMRUNUT1JTCQk1MTIKKyNkZWZpbmUgU0VMRUNUT1JfSVNGUkVFCQkweDgwMDAKKyNkZWZpbmUgU0VMRUNUT1JfSU5ERVhNQVNLCTB4MGZmZgorCitleHRlcm4gdW5zaWduZWQgc2hvcnQgU2VsZWN0b3JNYXBbTUFYX1NFTEVDVE9SU107CisKKyNkZWZpbmUgU0FGRU1BS0VQVFIocywgbykgXAorICAgICgoKGludCkgU2VsZWN0b3JNYXBbU2VsZWN0b3JNYXBbKHMpID4+IDNdICYgU0VMRUNUT1JfSU5ERVhNQVNLXSA8PCAxOSkgXAorICAgICB8IDB4NzAwMDAgfCAoKG8pICYgMHhmZmZmKSkKKworLyoKICAqIFN0cnVjdHVyZSB0byBob2xkIGluZm8gYWJvdXQgZWFjaCBzZWxlY3RvciB3ZSBjcmVhdGUuCiAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5kb3dzLmggYi9pbmNsdWRlL3dpbmRvd3MuaAppbmRleCBkZDkzN2M1Li45ZDNlYWYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmRvd3MuaAorKysgYi9pbmNsdWRlL3dpbmRvd3MuaApAQCAtNjYsNiArNjYsMTQgQEAKIAogI2RlZmluZSBNQUtFTE9ORyhsb3csIGhpZ2gpICgoTE9ORykoKChXT1JEKShsb3cpKSB8ICgoKERXT1JEKSgoV09SRCkoaGlnaCkpKSA8PCAxNikpKQogCisjaWZuZGVmIG1heAorI2RlZmluZSBtYXgoYSxiKSAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisjZW5kaWYKKworI2lmbmRlZiBtaW4KKyNkZWZpbmUgbWluKGEsYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2VuZGlmCisKIC8qCiB0eXBlZGVmIGxvbmcgTE9ORzsKIHR5cGVkZWYgV09SRCBIQU5ETEU7CkBAIC0xMzYsNiArMTQ0LDggQEAKIAlMUFNUUiAgIGxwc3pDbGFzc05hbWUgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogfSBXTkRDTEFTUywgKkxQV05EQ0xBU1M7CiAKK3R5cGVkZWYgTE9ORwkoKiBXTkRQUk9DKSgpIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwogI2RlZmluZSBDU19WUkVEUkFXICAgICAgICAgIDB4MDAwMQogI2RlZmluZSBDU19IUkVEUkFXICAgICAgICAgIDB4MDAwMgogI2RlZmluZSBDU19LRVlDVlRXSU5ET1cgICAgIDB4MDAwNApAQCAtMjMwLDYgKzI0MCwxNSBAQAogI2RlZmluZSBETEdDX1NUQVRJQyAgICAgICAgICAweDAxMDAKICNkZWZpbmUgRExHQ19CVVRUT04gICAgICAgICAgMHgyMDAwCiAKKy8qIFN0YW5kYXJkIGRpYWxvZyBidXR0b24gSURzICovCisjZGVmaW5lIElET0sgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJRENBTkNFTCAgICAgICAgICAgIDIKKyNkZWZpbmUgSURBQk9SVCAgICAgICAgICAgICAzCisjZGVmaW5lIElEUkVUUlkgICAgICAgICAgICAgNAorI2RlZmluZSBJRElHTk9SRSAgICAgICAgICAgIDUKKyNkZWZpbmUgSURZRVMgICAgICAgICAgICAgICA2CisjZGVmaW5lIElETk8gICAgICAgICAgICAgICAgNworCiAKIHR5cGVkZWYgc3RydWN0IHsgc2hvcnQgeCwgeTsgfSBQT0lOVDsKIHR5cGVkZWYgUE9JTlQgKlBQT0lOVDsKQEAgLTczNSwxNyArNzU0LDE3IEBACiAKIHR5cGVkZWYgc3RydWN0IHRhZ0JJVE1BUElORk9IRUFERVIKIHsKLSAgICB1bnNpZ25lZCBsb25nIGJpU2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nIGJpV2lkdGg7Ci0gICAgdW5zaWduZWQgbG9uZyBiaUhlaWdodDsKLSAgICB1bnNpZ25lZCBzaG9ydCBiaVBsYW5lczsKLSAgICB1bnNpZ25lZCBzaG9ydCBiaUJpdENvdW50OwotICAgIHVuc2lnbmVkIGxvbmcgYmlDb21wcmVzc2lvbjsKLSAgICB1bnNpZ25lZCBsb25nIGJpU2l6ZUltYWdlOwotICAgIHVuc2lnbmVkIGxvbmcgYmlYUGVsc1Blck1ldGVyOwotICAgIHVuc2lnbmVkIGxvbmcgYmlZUGVsc1Blck1ldGVyOwotICAgIHVuc2lnbmVkIGxvbmcgYmlDbHJVc2VkOwotICAgIHVuc2lnbmVkIGxvbmcgYmlDbHJJbXBvcnRhbnQ7CisgICAgRFdPUkQgCWJpU2l6ZTsKKyAgICBEV09SRCAJYmlXaWR0aDsKKyAgICBEV09SRCAJYmlIZWlnaHQ7CisgICAgV09SRCAJYmlQbGFuZXM7CisgICAgV09SRCAJYmlCaXRDb3VudDsKKyAgICBEV09SRCAJYmlDb21wcmVzc2lvbjsKKyAgICBEV09SRCAJYmlTaXplSW1hZ2U7CisgICAgRFdPUkQgCWJpWFBlbHNQZXJNZXRlcjsKKyAgICBEV09SRCAJYmlZUGVsc1Blck1ldGVyOworICAgIERXT1JEIAliaUNsclVzZWQ7CisgICAgRFdPUkQgCWJpQ2xySW1wb3J0YW50OwogfSBCSVRNQVBJTkZPSEVBREVSOwogCiB0eXBlZGVmIEJJVE1BUElORk9IRUFERVIgKiBMUEJJVE1BUElORk9IRUFERVI7CkBAIC0xMDIxLDggKzEwNDAsMzQgQEAKICNkZWZpbmUgR0NXX0hCUkJBQ0tHUk9VTkQgKC0xMCkKICNlbmRpZgogCi0jZGVmaW5lIE1CX09LIDAKLSNkZWZpbmUgTUJfSUNPTklORk9STUFUSU9OIDB4MDA0MAorI2RlZmluZSBNQl9PSyAgICAgICAgICAgICAgIDB4MDAwMAorI2RlZmluZSBNQl9PS0NBTkNFTCAgICAgICAgIDB4MDAwMQorI2RlZmluZSBNQl9BQk9SVFJFVFJZSUdOT1JFIDB4MDAwMgorI2RlZmluZSBNQl9ZRVNOT0NBTkNFTCAgICAgIDB4MDAwMworI2RlZmluZSBNQl9ZRVNOTyAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBNQl9SRVRSWUNBTkNFTCAgICAgIDB4MDAwNQorI2RlZmluZSBNQl9UWVBFTUFTSyAgICAgICAgIDB4MDAwRgorCisjZGVmaW5lIE1CX0lDT05IQU5EICAgICAgICAgMHgwMDEwCisjZGVmaW5lIE1CX0lDT05RVUVTVElPTiAgICAgMHgwMDIwCisjZGVmaW5lIE1CX0lDT05FWENMQU1BVElPTiAgMHgwMDMwCisjZGVmaW5lIE1CX0lDT05BU1RFUklTSyAgICAgMHgwMDQwCisjZGVmaW5lIE1CX0lDT05NQVNLICAgICAgICAgMHgwMEYwCisKKyNkZWZpbmUgTUJfSUNPTklORk9STUFUSU9OICBNQl9JQ09OQVNURVJJU0sKKyNkZWZpbmUgTUJfSUNPTlNUT1AgICAgICAgICBNQl9JQ09OSEFORAorCisjZGVmaW5lIE1CX0RFRkJVVFRPTjEgICAgICAgMHgwMDAwCisjZGVmaW5lIE1CX0RFRkJVVFRPTjIgICAgICAgMHgwMTAwCisjZGVmaW5lIE1CX0RFRkJVVFRPTjMgICAgICAgMHgwMjAwCisjZGVmaW5lIE1CX0RFRk1BU0sgICAgICAgICAgMHgwRjAwCisKKyNkZWZpbmUgTUJfQVBQTE1PREFMICAgICAgICAweDAwMDAKKyNkZWZpbmUgTUJfU1lTVEVNTU9EQUwgICAgICAweDEwMDAKKyNkZWZpbmUgTUJfVEFTS01PREFMICAgICAgICAweDIwMDAKKworI2RlZmluZSBNQl9OT0ZPQ1VTICAgICAgICAgIDB4ODAwMAorCiAKICNkZWZpbmUgRFRfVE9QIDAKICNkZWZpbmUgRFRfTEVGVCAwCkBAIC0xMDc5LDYgKzExMjQsMTEgQEAKICNkZWZpbmUgV1NfRVhfQUNDRVBURklMRVMgICAgICAweDAwMDAwMDEwTAogI2RlZmluZSBXU19FWF9UUkFOU1BBUkVOVCAgICAgIDB4MDAwMDAwMjBMCiAKKy8qIFdpbmRvdyBzY3JvbGxpbmcgKi8KKyNkZWZpbmUgU1dfU0NST0xMQ0hJTERSRU4gICAgICAweDAwMDEKKyNkZWZpbmUgU1dfSU5WQUxJREFURSAgICAgICAgICAweDAwMDIKKyNkZWZpbmUgU1dfRVJBU0UgICAgICAgICAgICAgICAweDAwMDMKKwogLyogQnV0dG9uIGNvbnRyb2wgc3R5bGVzICovCiAjZGVmaW5lIEJTX1BVU0hCVVRUT04gICAgICAgICAgMHgwMDAwMDAwMEwKICNkZWZpbmUgQlNfREVGUFVTSEJVVFRPTiAgICAgICAweDAwMDAwMDAxTApAQCAtMTMxOSw2ICsxMzY5LDcwIEBACiAjZGVmaW5lIE9EU19DSEVDS0VEICAgICAweDAwMDgKICNkZWZpbmUgT0RTX0ZPQ1VTICAgICAgIDB4MDAxMAogCisvKiBFZGl0IGNvbnRyb2wgc3R5bGVzICovCisjZGVmaW5lIEVTX0xFRlQgICAgICAgICAweDAwMDAwMDAwTAorI2RlZmluZSBFU19DRU5URVIgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgRVNfUklHSFQgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIEVTX01VTFRJTElORSAgICAweDAwMDAwMDA0TAorI2RlZmluZSBFU19VUFBFUkNBU0UgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgRVNfTE9XRVJDQVNFICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIEVTX1BBU1NXT1JEICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBFU19BVVRPVlNDUk9MTCAgMHgwMDAwMDA0MEwKKyNkZWZpbmUgRVNfQVVUT0hTQ1JPTEwgIDB4MDAwMDAwODBMCisjZGVmaW5lIEVTX05PSElTRVNFTCAgICAweDAwMDAwMTAwTAorI2RlZmluZSBFU19PRU1DT05WRVJUICAgMHgwMDAwMDQwMEwKKyNkZWZpbmUgRVNfUkVBRE9OTFkgICAgIDB4MDAwMDA4MDBMCisjZGVmaW5lIEVTX1dBTlRSRVRVUk4gICAweDAwMDAxMDAwTAorCisvKiBFZGl0IGNvbnRyb2wgbWVzc2FnZXMgKi8KKyNkZWZpbmUgRU1fR0VUU0VMICAgICAgICAgICAgICAoV01fVVNFUiswKQorI2RlZmluZSBFTV9TRVRTRUwgICAgICAgICAgICAgIChXTV9VU0VSKzEpCisjZGVmaW5lIEVNX0dFVFJFQ1QgICAgICAgICAgICAgKFdNX1VTRVIrMikKKyNkZWZpbmUgRU1fU0VUUkVDVCAgICAgICAgICAgICAoV01fVVNFUiszKQorI2RlZmluZSBFTV9TRVRSRUNUTlAgICAgICAgICAgIChXTV9VU0VSKzQpCisjZGVmaW5lIEVNX0xJTkVTQ1JPTEwgICAgICAgICAgKFdNX1VTRVIrNikKKyNkZWZpbmUgRU1fR0VUTU9ESUZZICAgICAgICAgICAoV01fVVNFUis4KQorI2RlZmluZSBFTV9TRVRNT0RJRlkgICAgICAgICAgIChXTV9VU0VSKzkpCisjZGVmaW5lIEVNX0dFVExJTkVDT1VOVCAgICAgICAgKFdNX1VTRVIrMTApCisjZGVmaW5lIEVNX0xJTkVJTkRFWCAgICAgICAgICAgKFdNX1VTRVIrMTEpCisjZGVmaW5lIEVNX1NFVEhBTkRMRSAgICAgICAgICAgKFdNX1VTRVIrMTIpCisjZGVmaW5lIEVNX0dFVEhBTkRMRSAgICAgICAgICAgKFdNX1VTRVIrMTMpCisjZGVmaW5lIEVNX0xJTkVMRU5HVEggICAgICAgICAgKFdNX1VTRVIrMTcpCisjZGVmaW5lIEVNX1JFUExBQ0VTRUwgICAgICAgICAgKFdNX1VTRVIrMTgpCisjZGVmaW5lIEVNX0dFVExJTkUgICAgICAgICAgICAgKFdNX1VTRVIrMjApCisjZGVmaW5lIEVNX0xJTUlUVEVYVCAgICAgICAgICAgKFdNX1VTRVIrMjEpCisjZGVmaW5lIEVNX0NBTlVORE8gICAgICAgICAgICAgKFdNX1VTRVIrMjIpCisjZGVmaW5lIEVNX1VORE8gICAgICAgICAgICAgICAgKFdNX1VTRVIrMjMpCisjZGVmaW5lIEVNX0ZNVExJTkVTICAgICAgICAgICAgKFdNX1VTRVIrMjQpCisjZGVmaW5lIEVNX0xJTkVGUk9NQ0hBUiAgICAgICAgKFdNX1VTRVIrMjUpCisjZGVmaW5lIEVNX1NFVFRBQlNUT1BTICAgICAgICAgKFdNX1VTRVIrMjcpCisjZGVmaW5lIEVNX1NFVFBBU1NXT1JEQ0hBUiAgICAgKFdNX1VTRVIrMjgpCisjZGVmaW5lIEVNX0VNUFRZVU5ET0JVRkZFUiAgICAgKFdNX1VTRVIrMjkpCisjZGVmaW5lIEVNX0dFVEZJUlNUVklTSUJMRUxJTkUgKFdNX1VTRVIrMzApCisjZGVmaW5lIEVNX1NFVFJFQURPTkxZICAgICAgICAgKFdNX1VTRVIrMzEpCisjZGVmaW5lIEVNX1NFVFdPUkRCUkVBS1BST0MgICAgKFdNX1VTRVIrMzIpCisjZGVmaW5lIEVNX0dFVFdPUkRCUkVBS1BST0MgICAgKFdNX1VTRVIrMzMpCisjZGVmaW5lIEVNX0dFVFBBU1NXT1JEQ0hBUiAgICAgKFdNX1VTRVIrMzQpCisKK3R5cGVkZWYgaW50IChDQUxMQkFDSyAqRURJVFdPUkRCUkVBS1BST0MpKExQU1RSIGxwY2gsIGludCBpY2hDdXJyZW50LAorCQkJCQkgIGludCBjY2gsIGludCBjb2RlKTsKKworLyogRURJVFdPUkRCUkVBS1BST0MgY29kZSB2YWx1ZXMgKi8KKyNkZWZpbmUgV0JfTEVGVCAgICAgICAgIDAKKyNkZWZpbmUgV0JfUklHSFQgICAgICAgIDEKKyNkZWZpbmUgV0JfSVNERUxJTUlURVIgIDIKKworLyogRWRpdCBjb250cm9sIG5vdGlmaWNhdGlvbiBjb2RlcyAqLworI2RlZmluZSBFTl9TRVRGT0NVUyAgICAgMHgwMTAwCisjZGVmaW5lIEVOX0tJTExGT0NVUyAgICAweDAyMDAKKyNkZWZpbmUgRU5fQ0hBTkdFICAgICAgIDB4MDMwMAorI2RlZmluZSBFTl9VUERBVEUgICAgICAgMHgwNDAwCisjZGVmaW5lIEVOX0VSUlNQQUNFICAgICAweDA1MDAKKyNkZWZpbmUgRU5fTUFYVEVYVCAgICAgIDB4MDUwMQorI2RlZmluZSBFTl9IU0NST0xMICAgICAgMHgwNjAxCisjZGVmaW5lIEVOX1ZTQ1JPTEwgICAgICAweDA2MDIKKworCiAjZGVmaW5lIFdNX0RSQVdJVEVNICAgICAgICAgMHgwMDJCCiAKIHR5cGVkZWYgc3RydWN0IHRhZ0RSQVdJVEVNU1RSVUNUCkBAIC0xNDg1LDEyICsxNTk5LDEyIEBACiBGYShpbnQsbHN0cmxlbixMUENTVFIsYSkKIEZhKExPTkcsRGlzcGF0Y2hNZXNzYWdlLExQTVNHLG1zZykKIEZhKHZvaWQsVXBkYXRlV2luZG93LEhXTkQsYSkKLUZhKEFUT00sQWRkQXRvbSxMUFNUUixhKQorRmEoQVRPTSxBZGRBdG9tLExQQ1NUUixhKQogRmEoQVRPTSxEZWxldGVBdG9tLEFUT00sYSkKLUZhKEFUT00sRmluZEF0b20sTFBTVFIsYSkKLUZhKEFUT00sR2xvYmFsQWRkQXRvbSxMUFNUUixhKQorRmEoQVRPTSxGaW5kQXRvbSxMUENTVFIsYSkKK0ZhKEFUT00sR2xvYmFsQWRkQXRvbSxMUENTVFIsYSkKIEZhKEFUT00sR2xvYmFsRGVsZXRlQXRvbSxBVE9NLGEpCi1GYShBVE9NLEdsb2JhbEZpbmRBdG9tLExQU1RSLGEpCitGYShBVE9NLEdsb2JhbEZpbmRBdG9tLExQQ1NUUixhKQogRmEoQk9PTCxEZWxldGVEQyxIREMsYSkKIEZhKEJPT0wsRGVsZXRlTWV0YUZpbGUsSEFORExFLGEpCiBGYShCT09MLERlbGV0ZU9iamVjdCxIQU5ETEUsYSkKQEAgLTE1MDQsNyArMTYxOCw3IEBACiBGYShCT09MLEdsb2JhbFVuV2lyZSxIQU5ETEUsYSkKIEZhKEJPT0wsR2xvYmFsVW5maXgsSEFORExFLGEpCiBGYShCT09MLEdsb2JhbFVubG9jayxIQU5ETEUsYSkKLUZhKEJPT0wsSW5pdEF0b21UYWJsZSxpbnQsYSkKK0ZhKEJPT0wsSW5pdEF0b21UYWJsZSxXT1JELGEpCiBGYShCT09MLElzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlLFdPUkQsYSkKIEZhKEJPT0wsSXNJY29uaWMsSFdORCxhKQogRmEoQk9PTCxJc1JlY3RFbXB0eSxMUFJFQ1QsYSkKQEAgLTE4NTgsMTAgKzE5NzIsMTAgQEAKIEZjKExPTkcsU2V0Qml0bWFwQml0cyxIQklUTUFQLGEsTE9ORyxiLExQU1RSLGMpCiBGYyhMT05HLFNldENsYXNzTG9uZyxIV05ELGEsc2hvcnQsYixMT05HLGMpCiBGYyhMT05HLFNldFdpbmRvd0xvbmcsSFdORCxhLHNob3J0LGIsTE9ORyxjKQotRmMoV09SRCxHZXRBdG9tTmFtZSxBVE9NLGEsTFBTVFIsYixpbnQsYykKK0ZjKFdPUkQsR2V0QXRvbU5hbWUsQVRPTSxhLExQU1RSLGIsc2hvcnQsYykKIEZjKFdPUkQsR2V0TWVudVN0YXRlLEhNRU5VLGEsV09SRCxiLFdPUkQsYykKIEZjKFdPUkQsR2V0UHJvZmlsZUludCxMUFNUUixhLExQU1RSLGIsaW50LGMpCi1GYyhXT1JELEdsb2JhbEdldEF0b21OYW1lLEFUT00sYSxMUFNUUixiLGludCxjKQorRmMoV09SRCxHbG9iYWxHZXRBdG9tTmFtZSxBVE9NLGEsTFBTVFIsYixzaG9ydCxjKQogRmMoV09SRCxTZXRDbGFzc1dvcmQsSFdORCxhLHNob3J0LGIsV09SRCxjKQogRmMoV09SRCxTZXRXaW5kb3dXb3JkLEhXTkQsYSxzaG9ydCxiLFdPUkQsYykKIEZiKFdPUkQsU2V0QmtNb2RlLEhEQyxhLFdPUkQsYikKQEAgLTE5MTEsNyArMjAyNSw3IEBACiBGZChMT05HLFNlbmRNZXNzYWdlLEhXTkQsYSxXT1JELGIsV09SRCxjLExPTkcsZCkKIEZkKEJPT0wsR2V0TWVzc2FnZSxMUE1TRyxtc2csSFdORCxiLFdPUkQsYyxXT1JELGQpCiBGZChCT09MLEdldFRleHRFeHRlbnRQb2ludCxIREMsYSxMUFNUUixiLHNob3J0LGMsTFBTSVpFLGQpCi1GZChCT09MLERyYXdJY29uLEhEQyxhLGludCxiLGludCxjLEhJQ09OLGQpCitGZChCT09MLERyYXdJY29uLEhEQyxhLHNob3J0LGIsc2hvcnQsYyxISUNPTixkKQogRmQoQk9PTCxFbnVtTWV0YUZpbGUsSERDLGEsTE9DQUxIQU5ETEUsYixGQVJQUk9DLGMsQllURSBGQVIqLGQpCiBGZChCT09MLEZsb29kRmlsbCxIREMsYSxpbnQsYixpbnQsYyxEV09SRCxkKQogRmQoQk9PTCxHZXRDaGFyV2lkdGgsSERDLGEsV09SRCxiLFdPUkQsYyxMUElOVCxkKQpAQCAtMTk4Niw3ICsyMTAwLDcgQEAKIEZlKExPTkcsRGVmRnJhbWVQcm9jLEhXTkQsYSxIV05ELGIsV09SRCxjLFdPUkQsZCxMT05HLGUpCiBGZShMT05HLFNlbmREbGdJdGVtTWVzc2FnZSxIV05ELGEsV09SRCxiLFdPUkQsYyxXT1JELGQsTE9ORyxlKQogRmUoaW50LERpYWxvZ0JveEluZGlyZWN0UGFyYW0sSEFORExFLGEsSEFORExFLGIsSFdORCxjLEZBUlBST0MsZCxMT05HLGUpCi1GZShpbnQsRGlhbG9nQm94UGFyYW0sSEFORExFLGEsTFBTVFIsYixIV05ELGMsRkFSUFJPQyxkLExPTkcsZSkKK0ZlKGludCxEaWFsb2dCb3hQYXJhbSxIQU5ETEUsYSxMUENTVFIsYixIV05ELGMsRkFSUFJPQyxkLExPTkcsZSkKIEZlKGludCxEbGdEaXJMaXN0LEhXTkQsYSxMUFNUUixiLGludCxjLGludCxkLFdPUkQsZSkKIEZlKGludCxEbGdEaXJMaXN0Q29tYm9Cb3gsSFdORCxhLExQU1RSLGIsaW50LGMsaW50LGQsV09SRCxlKQogRmUoaW50LEVzY2FwZSxIREMsYSxpbnQsYixpbnQsYyxMUFNUUixkLExQU1RSLGUpCkBAIC0xOTk5LDcgKzIxMTMsNyBAQAogRmUoaW50LFNldFZvaWNlQWNjZW50LGludCxhLGludCxiLGludCxjLGludCxkLGludCxlKQogRmUoaW50LFRvQXNjaWksV09SRCx3VmlydEtleSxXT1JELHdTY2FuQ29kZSxMUFNUUixscEtleVN0YXRlLExQVk9JRCxscENoYXIsV09SRCx3RmxhZ3MpCiBGZSh2b2lkLFBhaW50UmVjdCxIV05ELGEsSFdORCxiLEhEQyxjLEhCUlVTSCxkLExQUkVDVCxlKQotRmUodm9pZCxTY3JvbGxXaW5kb3csSFdORCxhLGludCxiLGludCxjLExQUkVDVCxkLExQUkVDVCxlKQorRmUodm9pZCxTY3JvbGxXaW5kb3csSFdORCxhLHNob3J0LGIsc2hvcnQsYyxMUFJFQ1QsZCxMUFJFQ1QsZSkKIEZlKHZvaWQsU2V0UmVjdCxMUFJFQ1QsYSxzaG9ydCxiLHNob3J0LGMsc2hvcnQsZCxzaG9ydCxlKQogRmUodm9pZCxTZXRSZWN0UmduLEhSR04sYSxzaG9ydCxiLHNob3J0LGMsc2hvcnQsZCxzaG9ydCxlKQogRmUodm9pZCxTZXRTY3JvbGxSYW5nZSxIV05ELGEsaW50LGIsaW50LGMsaW50LGQsQk9PTCxlKQpAQCAtMjAxMiw3ICsyMTI2LDcgQEAKIEZmKEJPT0wsU2NhbGVWaWV3cG9ydEV4dEV4LEhEQyxhLHNob3J0LGIsc2hvcnQsYyxzaG9ydCxkLHNob3J0LGUsTFBTSVpFLGYpCiBGZihCT09MLFNjYWxlV2luZG93RXh0RXgsSERDLGEsc2hvcnQsYixzaG9ydCxjLHNob3J0LGQsc2hvcnQsZSxMUFNJWkUsZikKIEZnKEJPT0wsUm91bmRSZWN0LEhEQyxhLHNob3J0LGIsc2hvcnQsYyxzaG9ydCxkLHNob3J0LGUsc2hvcnQsZixzaG9ydCxnKQotRmcoQk9PTCxTY3JvbGxEQyxIREMsYSxpbnQsYixpbnQsYyxMUFJFQ1QsZCxMUFJFQ1QsZSxIUkdOLGYsTFBSRUNULGcpCitGZyhCT09MLFNjcm9sbERDLEhEQyxhLHNob3J0LGIsc2hvcnQsYyxMUFJFQ1QsZCxMUFJFQ1QsZSxIUkdOLGYsTFBSRUNULGcpCiBGZyhCT09MLFRyYWNrUG9wdXBNZW51LEhNRU5VLGEsV09SRCxiLGludCxjLGludCxkLGludCxlLEhXTkQsZixMUFJFQ1QsZykKIEZnKEhDVVJTT1IsQ3JlYXRlQ3Vyc29yLEhBTkRMRSxhLGludCxiLGludCxjLGludCxkLGludCxlLExQU1RSLGYsTFBTVFIsZykKIEZnKEhJQ09OLENyZWF0ZUljb24sSEFORExFLGEsaW50LGIsaW50LGMsQllURSxkLEJZVEUsZSxMUFNUUixmLExQU1RSLGcpCkBAIC0yMDIyLDYgKzIxMzYsNyBAQAogRmgoQk9PTCxFeHRUZXh0T3V0LEhEQyxhLGludCxiLGludCxjLFdPUkQsZCxMUFJFQ1QsZSxMUFNUUixmLFdPUkQsZyxMUElOVCxoKQogRmgoSEFORExFLERlZmVyV2luZG93UG9zLEhBTkRMRSxoV2luUG9zSW5mbyxIV05ELGhXbmQsSFdORCxoV25kSW5zZXJ0QWZ0ZXIsaW50LHgsaW50LHksaW50LGN4LGludCxjeSxXT1JELHdGbGFncykKIEZoKExPTkcsVGFiYmVkVGV4dE91dCxIREMsYSxpbnQsYixpbnQsYyxMUFNUUixkLGludCxlLGludCxmLExQSU5ULGcsaW50LGgpCitGaChpbnQsU2Nyb2xsV2luZG93RXgsSFdORCxhLHNob3J0LGIsc2hvcnQsYyxMUFJFQ1QsZCxMUFJFQ1QsZSxIUkdOLGYsTFBSRUNULGcsV09SRCxoKQogRmkoQk9PTCxBcmMsSERDLGEsaW50LHhMZWZ0LGludCx5VG9wLGludCx4UmlnaHQsaW50LHlCb3R0b20saW50LHhTdGFydCxpbnQseVN0YXJ0LGludCx4RW5kLGludCx5RW5kKQogRmkoQk9PTCxDaG9yZCxIREMsYSxpbnQseExlZnQsaW50LHlUb3AsaW50LHhSaWdodCxpbnQseUJvdHRvbSxpbnQseFN0YXJ0LGludCx5U3RhcnQsaW50LHhFbmQsaW50LHlFbmQpCiBGaShCT09MLEJpdEJsdCxIREMsYSxzaG9ydCxiLHNob3J0LGMsc2hvcnQsZCxzaG9ydCxlLEhEQyxmLHNob3J0LGcsc2hvcnQsaCxEV09SRCxpKQpkaWZmIC0tZ2l0IGEvbG9hZGVyL01ha2VmaWxlIGIvbG9hZGVyL01ha2VmaWxlCmluZGV4IDY2MmI1OTcuLjg3M2E2YWMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9NYWtlZmlsZQorKysgYi9sb2FkZXIvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiBDRkxBR1M9JChDT1BUUykgJChERUJVR09QVFMpIC1JLi4vaW5jbHVkZQogCiBPQkpTPWR1bXAubyBmaWxlcy5vIGxkdC5vIGxkdGxpYi5vIHJlc291cmNlLm8gc2VsZWN0b3IubyBzaWduYWwubyBpbnQxYS5vIFwKLSAgICAgaW50MjEubyB3aW5lLm8KKyAgICAgaW50MjEubyB3aW5lLm8gbGlicmFyeS5vCiAKIGRlZmF1bHQ6IGxvYWRlci5vCiAKZGlmZiAtLWdpdCBhL2xvYWRlci9maWxlcy5jIGIvbG9hZGVyL2ZpbGVzLmMKaW5kZXggOGJmM2ZiYi4uYTQzNzFjNiAxMDA2NDQKLS0tIGEvbG9hZGVyL2ZpbGVzLmMKKysrIGIvbG9hZGVyL2ZpbGVzLmMKQEAgLTY2LDYgKzY2LDcgQEAKIAkJCXN0cm5jcHkoYnVmZmVyLCBkaXJuYW1lLCBidWZsZW4pOwogCQkJc3RybmNhdChidWZmZXIsICIvIiwgYnVmbGVuIC0gc3RybGVuKGJ1ZmZlcikpOwogCQkJc3RybmNhdChidWZmZXIsIGYtPmRfbmFtZSwgYnVmbGVuIC0gc3RybGVuKGJ1ZmZlcikpOworCQkJY2xvc2VkaXIoZCk7CiAJCQlyZXR1cm4gYnVmZmVyOwogCQkgICAgfQogCQl9CmRpZmYgLS1naXQgYS9sb2FkZXIvaW50MjEuYyBiL2xvYWRlci9pbnQyMS5jCmluZGV4IDk2ODgwMWIuLmZkZjUwNmEgMTAwNjQ0Ci0tLSBhL2xvYWRlci9pbnQyMS5jCisrKyBiL2xvYWRlci9pbnQyMS5jCkBAIC02NjUsNiArNjY1LDcgQEAKIAlzdHJ1Y3Qgc3RhdCBmaWxlc3RhdDsKIAlzdHJ1Y3QgdG0gKm5vdzsKIAorCWRpcm5hbWUgPSAoY2hhciAqKSBwb2ludGVyKERTLERYKTsKIAlQYXJzZURPU0ZpbGVOYW1lKHVuaXhuYW1lLCBkaXJuYW1lLCAmZHJpdmUpOwogCiAJewpAQCAtODcyLDcgKzg3Myw3IEBACiAJY2FzZSAweDEyOiAvKiBGSU5EIE5FWFQgTUFUQ0hJTkcgRklMRSBVU0lORyBGQ0IgKi8KIAljYXNlIDB4MTM6IC8qIERFTEVURSBGSUxFIFVTSU5HIEZDQiAqLwogCWNhc2UgMHgxNDogLyogU0VRVUVOVElBTCBSRUFEIEZST00gRkNCIEZJTEUgKi8JCQotCWNhc2UgMHgxNTogLyogU0VRVUVOVElBTCBXUklURSBUTyBGQ0IgRklMRQorCWNhc2UgMHgxNTogLyogU0VRVUVOVElBTCBXUklURSBUTyBGQ0IgRklMRSAqLwogCWNhc2UgMHgxNjogLyogQ1JFQVRFIE9SIFRSVU5DQVRFIEZJTEUgVVNJTkcgRkNCICovCiAJY2FzZSAweDE3OiAvKiBSRU5BTUUgRklMRSBVU0lORyBGQ0IgKi8KIAljYXNlIDB4MWE6IC8qIFNFVCBESVNLIFRSQU5TRkVSIEFSRUEgQUREUkVTUyAqLwpAQCAtODg4LDcgKzg4OSw3IEBACiAJY2FzZSAweDJlOiAvKiBTRVQgVkVSSUZZIEZMQUcgKi8KIAkJYnJlYWs7CiAKLQljYXNlIDB4MTg6IC8qIE5VTEwgRlVOQ1RJT05TIEZPUiBDUC9NIENPTVBBVElCSUxJVFkgKgorCWNhc2UgMHgxODogLyogTlVMTCBGVU5DVElPTlMgRk9SIENQL00gQ09NUEFUSUJJTElUWSAqLwogCWNhc2UgMHgxZDoKIAljYXNlIDB4MWU6CiAJY2FzZSAweDIwOgpkaWZmIC0tZ2l0IGEvbG9hZGVyL2xpYnJhcnkuYyBiL2xvYWRlci9saWJyYXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5NjM1MQotLS0gL2Rldi9udWxsCisrKyBiL2xvYWRlci9saWJyYXJ5LmMKQEAgLTAsMCArMSwzNyBAQAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAicHJvdG90eXBlcy5oIgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW4uaCIKKyNpbmNsdWRlICJnZGkuaCIKKyNpbmNsdWRlICJ3aW5lLmgiCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJTG9hZExpYnJhcnkJW0tFUk5FTC45NV0KKyAqLworSEFORExFIExvYWRMaWJyYXJ5KExQU1RSIGxpYm5hbWUpCit7CisgICAgSEFORExFIGhSZXQ7CisgICAgcHJpbnRmKCJMb2FkTGlicmFyeSAnJXMnXG4iLCBsaWJuYW1lKTsKKyAgICBoUmV0ID0gTG9hZEltYWdlKGxpYm5hbWUsIE5VTEwpOworICAgIHByaW50ZigiYWZ0ZXIgTG9hZExpYnJhcnkgaFJldD0lMDRYXG4iLCBoUmV0KTsKKyAgICByZXR1cm4gaFJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJRnJlZUxpYnJhcnkJW0tFUk5FTC45Nl0KKyAqLwordm9pZCBGcmVlTGlicmFyeShIQU5ETEUgaExpYikKK3sKKyAgICBwcmludGYoIkZyZWVMaWJyYXJ5KCUwNFgpO1xuIiwgaExpYik7CisgICAgaWYgKGhMaWIgIT0gKEhBTkRMRSlOVUxMKSBHbG9iYWxGcmVlKGhMaWIpOworfQorCmRpZmYgLS1naXQgYS9sb2FkZXIvcmVzb3VyY2UuYyBiL2xvYWRlci9yZXNvdXJjZS5jCmluZGV4IGVlYWZjOWUuLmEwYzk4NmMgMTAwNjQ0Ci0tLSBhL2xvYWRlci9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9yZXNvdXJjZS5jCkBAIC0xLDYgKzEsNyBAQAogc3RhdGljIGNoYXIgUkNTSWRbXSA9ICIkSWQ6IHJlc291cmNlLmMsdiAxLjQgMTk5My8wNy8wNCAwNDowNDoyMSByb290IEV4cCByb290ICQiOwogc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0ICBSb2JlcnQgSi4gQW1zdGFkdCwgMTk5MyI7CiAKKyNpbmNsdWRlIDxYMTEvSW50cmluc2ljLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KQEAgLTgsMTYgKzksMzIgQEAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgInByb3RvdHlwZXMuaCIKLSNpbmNsdWRlICJuZWV4ZS5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJnZGkuaCIKICNpbmNsdWRlICJ3aW5lLmgiCisjaW5jbHVkZSAiaWNvbi5oIgorI2luY2x1ZGUgImN1cnNvci5oIgogCiAjZGVmaW5lIE1JTihhLGIpCSgoYSkgPCAoYikgPyAoYSkgOiAoYikpCiAKK3R5cGVkZWYgc3RydWN0IHJlc291cmNlX3MKK3sKKyAgICBzdHJ1Y3QgcmVzb3VyY2VfcyAqbmV4dDsKKyAgICBIQU5ETEUgaW5mb19tZW07CisgICAgaW50IHNpemVfc2hpZnQ7CisgICAgc3RydWN0IHJlc291cmNlX25hbWVpbmZvX3MgbmFtZWluZm87CisgICAgSEFORExFIHJzY19tZW07Cit9IFJFU09VUkNFOworCiBzdGF0aWMgaW50IFJlc291cmNlRmQgPSAtMTsKIHN0YXRpYyBIQU5ETEUgUmVzb3VyY2VJbnN0ID0gMDsKIHN0YXRpYyBzdHJ1Y3Qgd19maWxlcyAqUmVzb3VyY2VGaWxlSW5mbyA9IE5VTEw7CitzdGF0aWMgUkVTT1VSQ0UgKlRvcCA9IE5VTEw7CitzdGF0aWMgSENVUlNPUiBoQWN0aXZlQ3Vyc29yOworZXh0ZXJuIEhJTlNUQU5DRSBoU3lzUmVzOworCitIQU5ETEUgUlNDX0xvYWRSZXNvdXJjZShpbnQgaW5zdGFuY2UsIGNoYXIgKnJzY19uYW1lLCBpbnQgdHlwZSwgaW50ICppbWFnZV9zaXplX3JldCk7CiAKIAwKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMjcsNiArMjQ0LDExIEBACiAJICAgIHByaW50ZigiRmluZFJlc291cmNlQnlOYW1lICglcykgYmFkIHR5cGVpbmZvIHNpemUgIVxuIiwgcmVzb3VyY2VfbmFtZSk7CiAJICAgIHJldHVybiAtMTsKIAl9CisjaWZkZWYgREVCVUdfUkVTT1VSQ0UKKwlwcmludGYoIkZpbmRSZXNvdXJjZUJ5TmFtZSB0eXBlaW5mby50eXBlX2lkPSVkIHR5cGVfaWQ9JWRcbiIsCisJCQl0eXBlaW5mby50eXBlX2lkLCB0eXBlX2lkKTsKKyNlbmRpZgorCWlmICh0eXBlaW5mby50eXBlX2lkID09IDApIGJyZWFrOwogCWlmICh0eXBlaW5mby50eXBlX2lkID09IHR5cGVfaWQgfHwgdHlwZV9pZCA9PSAtMSkKIAl7CiAJICAgIGZvciAoaSA9IDA7IGkgPCB0eXBlaW5mby5jb3VudDsgaSsrKQpAQCAtMjQ4LDYgKzI3MCwxMCBAQAogCQlyZWFkKFJlc291cmNlRmQsIG5hbWUsIG5ieXRlcyk7CiAJCWxzZWVrKFJlc291cmNlRmQsIG9sZF9wb3MsIFNFRUtfU0VUKTsKIAkJbmFtZVtuYnl0ZXNdID0gJ1wwJzsKKyNpZmRlZiBERUJVR19SRVNPVVJDRQorCQlwcmludGYoIkZpbmRSZXNvdXJjZUJ5TmFtZSB0eXBlX2lkPSVkIG5hbWU9JyVzJyByZXNvdXJjZV9uYW1lPSclcydcbiIsIAorCQkJCXR5cGVpbmZvLnR5cGVfaWQsIG5hbWUsIHJlc291cmNlX25hbWUpOworI2VuZGlmCiAJCWlmIChzdHJjYXNlY21wKG5hbWUsIHJlc291cmNlX25hbWUpID09IDApCiAJCXsKIAkJICAgIG1lbWNweShyZXN1bHRfcCwgJm5hbWVpbmZvLCBzaXplb2YobmFtZWluZm8pKTsKQEAgLTI1NSwzMSArMjgxLDI4OSBAQAogCQl9CiAJICAgIH0KIAl9CisJZWxzZSB7CisJICAgIGxzZWVrKFJlc291cmNlRmQsICh0eXBlaW5mby5jb3VudCAqIHNpemVvZihuYW1laW5mbykpLCBTRUVLX0NVUik7CisJfQogICAgIH0KLSAgICBwcmludGYoIkZpbmRSZXNvdXJjZUJ5TmFtZSAoJXMpIHR5cGVpbmZvLnR5cGVfaWQgPSAwICFcbiIsIHJlc291cmNlX25hbWUpOwotICAgIAogICAgIHJldHVybiAtMTsKIH0KLQwKKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJCUxvYWRJY29uCisgKgkJCUxvYWRJY29uIFtVU0VSLjE3NF0KICAqLwotSElDT04KLUxvYWRJY29uKEhBTkRMRSBpbnN0YW5jZSwgTFBTVFIgaWNvbl9uYW1lKQorSElDT04gTG9hZEljb24oSEFORExFIGluc3RhbmNlLCBMUFNUUiBpY29uX25hbWUpCiB7Ci0gIGZwcmludGYoc3RkZXJyLCJMb2FkSWNvbjogKCVkKSwlZFxuIixpbnN0YW5jZSxpY29uX25hbWUpOworICAgIEhJQ09OIAloSWNvbjsKKyAgICBIQU5ETEUgCXJzY19tZW07CisgICAgV09SRCAJKmxwOworICAgIElDT05ERVNDUklQICpscGljb2Rlc2M7CisgICAgSUNPTkFMTE9DCSpscGljbzsKKyAgICBpbnQJCXdpZHRoLCBoZWlnaHQ7CisgICAgQklUTUFQSU5GTyAJKmJtaTsKKyAgICBCSVRNQVBJTkZPSEVBREVSIAkqYmloOworICAgIFJHQlFVQUQJKnJnYnE7CisgICAgSEJJVE1BUCAJaEJpdE1hcDsKKyAgICBIREMgCWhNZW1EQzsKKyAgICBIREMgCWhNZW1EQzI7CisgICAgSERDIAloZGM7CisgICAgaW50IAlpLCBqLCBpbWFnZV9zaXplOworI2lmZGVmIERFQlVHX1JFU09VUkNFCisgICAgcHJpbnRmKCJMb2FkSWNvbjogaW5zdGFuY2UgPSAlMDR4LCBuYW1lID0gJTA4eFxuIiwKKwkgICBpbnN0YW5jZSwgaWNvbl9uYW1lKTsKKyNlbmRpZgorICAgIAorICAgIGlmIChpbnN0YW5jZSA9PSAoSEFORExFKU5VTEwpICBpbnN0YW5jZSA9IGhTeXNSZXM7CisgICAgaWYgKCEoaGRjID0gR2V0REMoR2V0RGVza3RvcFdpbmRvdygpKSkpIHJldHVybiAwOworICAgIHJzY19tZW0gPSBSU0NfTG9hZFJlc291cmNlKGluc3RhbmNlLCBpY29uX25hbWUsIE5FX1JTQ1RZUEVfR1JPVVBfSUNPTiwgCisJCQkgICAgICAgJmltYWdlX3NpemUpOworICAgIGlmIChyc2NfbWVtID09IChIQU5ETEUpTlVMTCkgeworCXByaW50ZigiTG9hZEljb24gLyBJY29uICUwNFggbm90IEZvdW5kICFcbiIsIGljb25fbmFtZSk7CisJcmV0dXJuIDA7CisJfQorICAgIGxwID0gKFdPUkQgKilHbG9iYWxMb2NrKHJzY19tZW0pOworICAgIGlmIChscCA9PSBOVUxMKSB7CisJR2xvYmFsRnJlZShyc2NfbWVtKTsKKwlyZXR1cm4gMDsKKwl9CisgICAgbHBpY29kZXNjID0gKElDT05ERVNDUklQICopKGxwICsgMyk7CisgICAgaEljb24gPSBHbG9iYWxBbGxvYyhHTUVNX01PVkVBQkxFLCBzaXplb2YoSUNPTkFMTE9DKSArIDEwMjQpOworICAgIGlmIChoSWNvbiA9PSAoSElDT04pTlVMTCkgeworCUdsb2JhbEZyZWUocnNjX21lbSk7CisJcmV0dXJuIDA7CisJfQorICAgIHByaW50ZigiTG9hZEljb24gQWxsb2MgaEljb249JVhcbiIsIGhJY29uKTsKKyAgICBscGljbyA9IChJQ09OQUxMT0MgKilHbG9iYWxMb2NrKGhJY29uKTsKKyAgICBscGljby0+ZGVzY3JpcHRvciA9ICpscGljb2Rlc2M7CisgICAgd2lkdGggPSBscGljb2Rlc2MtPldpZHRoOworICAgIGhlaWdodCA9IGxwaWNvZGVzYy0+SGVpZ2h0OworICAgIEdsb2JhbFVubG9jayhyc2NfbWVtKTsKKyAgICBHbG9iYWxGcmVlKHJzY19tZW0pOworICAgIHJzY19tZW0gPSBSU0NfTG9hZFJlc291cmNlKGluc3RhbmNlLCAKKyAgICAJTUFLRUlOVFJFU09VUkNFKGxwaWNvZGVzYy0+aWNvRElCT2Zmc2V0KSwgCisgICAgCU5FX1JTQ1RZUEVfSUNPTiwgJmltYWdlX3NpemUpOworICAgIGlmIChyc2NfbWVtID09IChIQU5ETEUpTlVMTCkgeworCXByaW50ZigiTG9hZEljb24gLyBJY29uICUwNFggQml0bWFwcyBub3QgRm91bmQgIVxuIiwgaWNvbl9uYW1lKTsKKwlyZXR1cm4gMDsKKwl9CisgICAgbHAgPSAoV09SRCAqKUdsb2JhbExvY2socnNjX21lbSk7CisgICAgaWYgKGxwID09IE5VTEwpIHsKKwlHbG9iYWxGcmVlKHJzY19tZW0pOworCXJldHVybiAwOworIAl9CisgICAgYm1pID0gKEJJVE1BUElORk8gKilscDsKKyAgICBiaWggPSAoQklUTUFQSU5GT0hFQURFUiAqKWxwOworICAgIHJnYnEgPSAmYm1pLT5ibWlDb2xvcnNbMF07CisgICAgYmloLT5iaUhlaWdodCA9IGJpaC0+YmlIZWlnaHQgLyAyOworLyoKKyAgICBwcmludGYoIkxvYWRJY29uIC8gaW1hZ2Vfc2l6ZT0lZCB3aWR0aD0lZCBoZWlnaHQ9JWQgYmloLT5iaUJpdENvdW50PSVkIGJpaC0+YmlTaXplSW1hZ2U9JWxkXG4iLCAKKyAgICAJaW1hZ2Vfc2l6ZSwgd2lkdGgsIGhlaWdodCwgYmloLT5iaUJpdENvdW50LCBiaWgtPmJpU2l6ZUltYWdlKTsKKyovCisgICAgaWYgKGJpaC0+YmlTaXplID09IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSkKKwlscGljby0+aEJpdG1hcCA9IENvbnZlcnRJbmZvQml0bWFwKGhkYywgKEJJVE1BUElORk8gKiliaWgpOworICAgIGVsc2UKKyAgICAgICAgbHBpY28tPmhCaXRtYXAgPSAwOworICAgIGJpaC0+YmlCaXRDb3VudCA9IDE7CisgICAgYmloLT5iaUNsclVzZWQgPSBiaWgtPmJpQ2xySW1wb3J0YW50ICA9IDI7CisgICAgcmdicVswXS5yZ2JCbHVlIAk9IDB4RkY7CisgICAgcmdicVswXS5yZ2JHcmVlbiAJPSAweEZGOworICAgIHJnYnFbMF0ucmdiUmVkIAk9IDB4RkY7CisgICAgcmdicVswXS5yZ2JSZXNlcnZlZCA9IDB4MDA7CisgICAgcmdicVsxXS5yZ2JCbHVlIAk9IDB4MDA7CisgICAgcmdicVsxXS5yZ2JHcmVlbiAJPSAweDAwOworICAgIHJnYnFbMV0ucmdiUmVkIAk9IDB4MDA7CisgICAgcmdicVsxXS5yZ2JSZXNlcnZlZCA9IDB4MDA7CisgICAgbHBpY28tPmhCaXRNYXNrID0gQ3JlYXRlRElCaXRtYXAoaGRjLCBiaWgsIENCTV9JTklULAorICAgIAkoTFBTVFIpbHAgKyBiaWgtPmJpU2l6ZUltYWdlIC0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpIC8gMiAtIDQsCisJKEJJVE1BUElORk8gKiliaWgsIERJQl9SR0JfQ09MT1JTICk7CisgICAgR2xvYmFsVW5sb2NrKHJzY19tZW0pOworICAgIEdsb2JhbEZyZWUocnNjX21lbSk7CisgICAgCisgICAgaE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGhkYyk7CisgICAgaE1lbURDMiA9IENyZWF0ZUNvbXBhdGlibGVEQyhoZGMpOworICAgIFNlbGVjdE9iamVjdChoTWVtREMsIGxwaWNvLT5oQml0bWFwKTsKKyAgICBTZWxlY3RPYmplY3QoaE1lbURDMiwgbHBpY28tPmhCaXRNYXNrKTsKKyAgICBCaXRCbHQoaE1lbURDLCAwLCAwLCBiaWgtPmJpV2lkdGgsIGJpaC0+YmlIZWlnaHQsIGhNZW1EQzIsIDAsIDAsIFNSQ0lOVkVSVCk7CisgICAgRGVsZXRlREMoaE1lbURDKTsKKyAgICBEZWxldGVEQyhoTWVtREMyKTsKKworICAgIFJlbGVhc2VEQygwLCBoZGMpOworICAgIHJldHVybiBoSWNvbjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQlEZXN0cm95SWNvbiBbVVNFUi40NTddCisgKi8KK0JPT0wgRGVzdHJveUljb24oSElDT04gaEljb24pCit7CisgICAgSUNPTkFMTE9DCSpscGljbzsKKyAgICBpZiAoaEljb24gPT0gKEhJQ09OKU5VTEwpIHJldHVybiBGQUxTRTsKKyAgICBscGljbyA9IChJQ09OQUxMT0MgKilHbG9iYWxMb2NrKGhJY29uKTsKKyAgICBpZiAobHBpY28tPmhCaXRtYXAgIT0gKEhCSVRNQVApTlVMTCkgRGVsZXRlT2JqZWN0KGxwaWNvLT5oQml0bWFwKTsKKyAgICBHbG9iYWxGcmVlKGhJY29uKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQlMb2FkQ3Vyc29yIFtVU0VSLjE3M10KKyAqLworSENVUlNPUiBMb2FkQ3Vyc29yKEhBTkRMRSBpbnN0YW5jZSwgTFBTVFIgY3Vyc29yX25hbWUpCit7CisgICAgWENvbG9yCWJrY29sb3I7CisgICAgWENvbG9yCWZnY29sb3I7CisgICAgSENVUlNPUiAJaEN1cnNvcjsKKyAgICBIQU5ETEUgCXJzY19tZW07CisgICAgV09SRCAJKmxwOworICAgIENVUlNPUkRFU0NSSVAgKmxwY3VyZGVzYzsKKyAgICBDVVJTT1JBTExPQwkgICpscGN1cjsKKyAgICBCSVRNQVAgCUJpdE1hcDsKKyAgICBIQklUTUFQIAloQml0TWFwOworICAgIEhEQyAJaE1lbURDOworICAgIEhEQyAJaGRjOworICAgIGludCBpLCBqLCBpbWFnZV9zaXplOworI2lmZGVmIERFQlVHX1JFU09VUkNFCisgICAgcHJpbnRmKCJMb2FkQ3Vyc29yOiBpbnN0YW5jZSA9ICUwNHgsIG5hbWUgPSAlMDh4XG4iLAorCSAgIGluc3RhbmNlLCBjdXJzb3JfbmFtZSk7CisjZW5kaWYgICAgCisgICAgaWYgKCEoaGRjID0gR2V0REMoR2V0RGVza3RvcFdpbmRvdygpKSkpIHJldHVybiAwOworICAgIGlmIChpbnN0YW5jZSA9PSAoSEFORExFKU5VTEwpICBpbnN0YW5jZSA9IGhTeXNSZXM7CisgICAgcnNjX21lbSA9IFJTQ19Mb2FkUmVzb3VyY2UoaW5zdGFuY2UsIGN1cnNvcl9uYW1lLCBORV9SU0NUWVBFX0dST1VQX0NVUlNPUiwgCisJCQkgICAgICAgJmltYWdlX3NpemUpOworICAgIGlmIChyc2NfbWVtID09IChIQU5ETEUpTlVMTCkgeworCXByaW50ZigiTG9hZEN1cnNvciAvIEN1cnNvciAlMDhYIG5vdCBGb3VuZCAhXG4iLCBjdXJzb3JfbmFtZSk7CisJcmV0dXJuIDA7CisJfQorICAgIGxwID0gKFdPUkQgKilHbG9iYWxMb2NrKHJzY19tZW0pOworICAgIGlmIChscCA9PSBOVUxMKSB7CisJR2xvYmFsRnJlZShyc2NfbWVtKTsKKwlyZXR1cm4gMDsKKwl9CisgICAgbHBjdXJkZXNjID0gKENVUlNPUkRFU0NSSVAgKikobHAgKyAzKTsKKyNpZmRlZiBERUJVR19DVVJTT1IKKyAgICBwcmludGYoIkxvYWRDdXJzb3IgLyBpbWFnZV9zaXplPSVkXG4iLCBpbWFnZV9zaXplKTsKKyAgICBwcmludGYoIkxvYWRDdXJzb3IgLyBjdXJSZXNlcnZlZD0lWFxuIiwgKmxwKTsKKyAgICBwcmludGYoIkxvYWRDdXJzb3IgLyBjdXJSZXNvdXJjZVR5cGU9JVhcbiIsICoobHAgKyAxKSk7CisgICAgcHJpbnRmKCJMb2FkQ3Vyc29yIC8gY3VyUmVzb3VyY2VDb3VudD0lWFxuIiwgKihscCArIDIpKTsKKyAgICBwcmludGYoIkxvYWRDdXJzb3IgLyBjdXJzb3IgV2lkdGg9JWRcbiIsIChpbnQpbHBjdXJkZXNjLT5XaWR0aCk7CisgICAgcHJpbnRmKCJMb2FkQ3Vyc29yIC8gY3Vyc29yIEhlaWdodD0lZFxuIiwgKGludClscGN1cmRlc2MtPkhlaWdodCk7CisgICAgcHJpbnRmKCJMb2FkQ3Vyc29yIC8gY3Vyc29yIGN1clhIb3RzcG90PSVkXG4iLCAoaW50KWxwY3VyZGVzYy0+Y3VyWEhvdHNwb3QpOworICAgIHByaW50ZigiTG9hZEN1cnNvciAvIGN1cnNvciBjdXJZSG90c3BvdD0lZFxuIiwgKGludClscGN1cmRlc2MtPmN1cllIb3RzcG90KTsKKyAgICBwcmludGYoIkxvYWRDdXJzb3IgLyBjdXJzb3IgY3VyRElCU2l6ZT0lbFhcbiIsIChEV09SRClscGN1cmRlc2MtPmN1ckRJQlNpemUpOworICAgIHByaW50ZigiTG9hZEN1cnNvciAvIGN1cnNvciBjdXJESUJPZmZzZXQ9JWxYXG4iLCAoRFdPUkQpbHBjdXJkZXNjLT5jdXJESUJPZmZzZXQpOworI2VuZGlmCisgICAgaEN1cnNvciA9IEdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsIHNpemVvZihDVVJTT1JBTExPQykgKyAxMDI0TCk7IAorICAgIGlmIChoQ3Vyc29yID09IChIQ1VSU09SKU5VTEwpIHsKKwlHbG9iYWxGcmVlKHJzY19tZW0pOworCXJldHVybiAwOworCX0KKyAgICBwcmludGYoIkxvYWRDdXJzb3IgQWxsb2MgaEN1cnNvcj0lWFxuIiwgaEN1cnNvcik7CisgICAgbHBjdXIgPSAoQ1VSU09SQUxMT0MgKilHbG9iYWxMb2NrKGhDdXJzb3IpOworICAgIGxwY3VyLT5kZXNjcmlwdG9yID0gKmxwY3VyZGVzYzsKKyAgICBHbG9iYWxVbmxvY2socnNjX21lbSk7CisgICAgR2xvYmFsRnJlZShyc2NfbWVtKTsKKyAgICByc2NfbWVtID0gUlNDX0xvYWRSZXNvdXJjZShpbnN0YW5jZSwgCisgICAgCU1BS0VJTlRSRVNPVVJDRShscGN1cmRlc2MtPmN1ckRJQk9mZnNldCksIAorICAgIAlORV9SU0NUWVBFX0NVUlNPUiwgJmltYWdlX3NpemUpOworICAgIGlmIChyc2NfbWVtID09IChIQU5ETEUpTlVMTCkgeworCXByaW50ZigiTG9hZEN1cnNvciAvIEN1cnNvciAlMDhYIEJpdG1hcCBub3QgRm91bmQgIVxuIiwgY3Vyc29yX25hbWUpOworCXJldHVybiAwOworCX0KKyAgICBscCA9IChXT1JEICopR2xvYmFsTG9jayhyc2NfbWVtKTsKKyAgICBpZiAobHAgPT0gTlVMTCkgeworCUdsb2JhbEZyZWUocnNjX21lbSk7CisJcmV0dXJuIDA7CisgCX0KKyAgICBscCArPSAyOworICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgIAlwcmludGYoIiUwNFggIiwgKihscCArIGopKTsKKyAgICBpZiAoKmxwID09IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSkKKwlscGN1ci0+aEJpdG1hcCA9IENvbnZlcnRJbmZvQml0bWFwKGhkYywgKEJJVE1BUElORk8gKilscCk7CisgICAgZWxzZQorICAgICAgICBscGN1ci0+aEJpdG1hcCA9IDA7CisgICAgbHAgKz0gc2l6ZW9mKEJJVE1BUCk7CisgICAgZm9yIChpID0gMDsgaSA8IDgxOyBpKyspIHsKKwljaGFyIHRlbXAgPSAqKChjaGFyICopbHAgKyAxNjIgKyBpKTsKKwkqKChjaGFyICopbHAgKyAxNjIgKyBpKSA9ICooKGNoYXIgKilscCArIDMyNCAtIGkpOworCSooKGNoYXIgKilscCArIDMyNCAtIGkpID0gdGVtcDsKKwl9CitwcmludGYoIkxvYWRDdXJzb3IgLyBiZWZvcmUgWENyZWF0ZVBpeG1hcEZyb21CaXRtYXBEYXRhICFcbiIpOworICAgIGxwY3VyLT5waXhzaGFwZSA9IFhDcmVhdGVQaXhtYXBGcm9tQml0bWFwRGF0YSgKKyAgICAJWFRfZGlzcGxheSwgRGVmYXVsdFJvb3RXaW5kb3coWFRfZGlzcGxheSksIAorICAgICAgICAoKGNoYXIgKilscCArIDIxMSksIDMyLCAzMiwKKy8qCisgICAgICAgIGxwY3VyZGVzYy0+V2lkdGggLyAyLCBscGN1cmRlc2MtPkhlaWdodCAvIDQsIAorKi8KKyAgICAgICAgV2hpdGVQaXhlbChYVF9kaXNwbGF5LCBEZWZhdWx0U2NyZWVuKFhUX2Rpc3BsYXkpKSwgCisgICAgICAgIEJsYWNrUGl4ZWwoWFRfZGlzcGxheSwgRGVmYXVsdFNjcmVlbihYVF9kaXNwbGF5KSksIDEpOworICAgIGxwY3VyLT5waXhtYXNrID0gbHBjdXItPnBpeHNoYXBlOworICAgIGJrY29sb3IucGl4ZWwgPSBXaGl0ZVBpeGVsKFhUX2Rpc3BsYXksIERlZmF1bHRTY3JlZW4oWFRfZGlzcGxheSkpOyAKKyAgICBmZ2NvbG9yLnBpeGVsID0gQmxhY2tQaXhlbChYVF9kaXNwbGF5LCBEZWZhdWx0U2NyZWVuKFhUX2Rpc3BsYXkpKTsKK3ByaW50ZigiTG9hZEN1cnNvciAvIGJlZm9yZSBYQ3JlYXRlUGl4bWFwQ3Vyc29yICFcbiIpOworICAgIGxwY3VyLT54Y3Vyc29yID0gWENyZWF0ZVBpeG1hcEN1cnNvcihYVF9kaXNwbGF5LAorIAlscGN1ci0+cGl4c2hhcGUsIGxwY3VyLT5waXhtYXNrLCAKKyAJJmZnY29sb3IsICZia2NvbG9yLCBscGN1ci0+ZGVzY3JpcHRvci5jdXJYSG90c3BvdCwgCisgCWxwY3VyLT5kZXNjcmlwdG9yLmN1cllIb3RzcG90KTsKKworICAgIFJlbGVhc2VEQygwLCBoZGMpOyAKKyAgICBHbG9iYWxVbmxvY2socnNjX21lbSk7CisgICAgR2xvYmFsRnJlZShyc2NfbWVtKTsKKyAgICByZXR1cm4gaEN1cnNvcjsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCURlc3Ryb3lDdXJzb3IgW1VTRVIuNDU4XQorICovCitCT09MIERlc3Ryb3lDdXJzb3IoSENVUlNPUiBoQ3Vyc29yKQoreworICAgIENVUlNPUkFMTE9DCSpscGN1cjsKKyAgICBpZiAoaEN1cnNvciA9PSAoSENVUlNPUilOVUxMKSByZXR1cm4gRkFMU0U7CisgICAgbHBjdXIgPSAoQ1VSU09SQUxMT0MgKilHbG9iYWxMb2NrKGhDdXJzb3IpOworICAgIGlmIChscGN1ci0+aEJpdG1hcCAhPSAoSEJJVE1BUClOVUxMKSBEZWxldGVPYmplY3QobHBjdXItPmhCaXRtYXApOworICAgIEdsb2JhbFVubG9jayhoQ3Vyc29yKTsKKyAgICBHbG9iYWxGcmVlKGhDdXJzb3IpOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCVNldEN1cnNvciBbVVNFUi42OV0KKyAqLworSENVUlNPUiBTZXRDdXJzb3IoSENVUlNPUiBoQ3Vyc29yKQoreworICAgIEhEQwkJaERDOworICAgIEhEQwkJaE1lbURDOworICAgIEJJVE1BUAlibTsKKyAgICBDVVJTT1JBTExPQwkqbHBjdXI7CisgICAgSENVUlNPUgloT2xkQ3Vyc29yOworI2lmZGVmIERFQlVHX0NVUlNPUgorICAgIHByaW50ZigiU2V0Q3Vyc29yIC8gaEN1cnNvcj0lMDRYICFcbiIsIGhDdXJzb3IpOworI2VuZGlmCisgICAgaWYgKGhDdXJzb3IgPT0gKEhDVVJTT1IpTlVMTCkgcmV0dXJuIEZBTFNFOworICAgIGxwY3VyID0gKENVUlNPUkFMTE9DICopR2xvYmFsTG9jayhoQ3Vyc29yKTsKKyAgICBoT2xkQ3Vyc29yID0gaEFjdGl2ZUN1cnNvcjsKKyAgICAKK3ByaW50ZigiU2V0Q3Vyc29yIC8gYmVmb3JlIFhEZWZpbmVDdXJzb3IgIVxuIik7CisgICAgWERlZmluZUN1cnNvcihYVF9kaXNwbGF5LCBEZWZhdWx0Um9vdFdpbmRvdyhYVF9kaXNwbGF5KSwgbHBjdXItPnhjdXJzb3IpOworICAgIEdsb2JhbFVubG9jayhoQ3Vyc29yKTsKKyAgICBoQWN0aXZlQ3Vyc29yID0gaEN1cnNvcjsKKyAgICByZXR1cm4gaE9sZEN1cnNvcjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQlTaG93Q3Vyc29yIFtVU0VSLjcxXQorICovCitpbnQgU2hvd0N1cnNvcihCT09MIGJTaG93KQoreworICAgIGlmIChiU2hvdykgeworICAgIAl9CiAgICAgcmV0dXJuIDA7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQkJTG9hZEN1cnNvcgotICovCi1IQ1VSU09SCi1Mb2FkQ3Vyc29yKEhBTkRMRSBpbnN0YW5jZSwgTFBTVFIgY3Vyc29yX25hbWUpCi17Ci0gIGZwcmludGYoc3RkZXJyLCJMb2FkQ3Vyc29yOiAoJWQpLCVkXG4iLGluc3RhbmNlLGN1cnNvcl9uYW1lKTsKLSAgICByZXR1cm4gMDsKLX0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQlMb2FkQWNjZWxlcmF0b3JzCkBAIC0yOTYsOCArNTgwLDQzIEBACiAgKi8KIEhBTkRMRSBGaW5kUmVzb3VyY2UoSEFORExFIGluc3RhbmNlLCBMUFNUUiByZXNvdXJjZV9uYW1lLCBMUFNUUiB0eXBlX25hbWUpCiB7Ci0gICAgZnByaW50ZihzdGRlcnIsIkZpbmRSZXNvdXJjZTogKCVkKSwlZFxuIixpbnN0YW5jZSwgcmVzb3VyY2VfbmFtZSwgdHlwZV9uYW1lKTsKLSAgICByZXR1cm4gMDsKKyAgICBSRVNPVVJDRSAqcjsKKyAgICBIQU5ETEUgcmg7CisKKyAgICBpZiAoaW5zdGFuY2UgPT0gMCkKKwlyZXR1cm4gMDsKKyAgICAKKyAgICBpZiAoT3BlblJlc291cmNlRmlsZShpbnN0YW5jZSkgPCAwKQorCXJldHVybiAwOworICAgIAorICAgIHJoID0gR2xvYmFsQWxsb2MoR01FTV9NT1ZFQUJMRSwgc2l6ZW9mKCpyKSk7CisgICAgaWYgKHJoID09IDApCisJcmV0dXJuIDA7CisgICAgciA9IChSRVNPVVJDRSAqKUdsb2JhbExvY2socmgpOworCisgICAgci0+bmV4dCA9IFRvcDsKKyAgICBUb3AgPSByOworICAgIHItPmluZm9fbWVtID0gcmg7CisgICAgci0+cnNjX21lbSA9IDA7CisKKyAgICBpZiAoKChpbnQpIHJlc291cmNlX25hbWUgJiAweGZmZmYwMDAwKSA9PSAwKQorICAgIHsKKwlyLT5zaXplX3NoaWZ0ID0gRmluZFJlc291cmNlQnlOdW1iZXIoJnItPm5hbWVpbmZvLCB0eXBlX25hbWUsCisJCQkJCSAgICAgKGludCkgcmVzb3VyY2VfbmFtZSB8IDB4ODAwMCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJci0+c2l6ZV9zaGlmdCA9IEZpbmRSZXNvdXJjZUJ5TmFtZSgmci0+bmFtZWluZm8sIHR5cGVfbmFtZSwgCisJCQkJCSAgIHJlc291cmNlX25hbWUpOworICAgIH0KKyAgICAKKyAgICBpZiAoci0+c2l6ZV9zaGlmdCA9PSAtMSkKKyAgICB7CisJR2xvYmFsRnJlZShyaCk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIHJoOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzA1LDggKzYyNCwzNiBAQAogICovCiBIQU5ETEUgTG9hZFJlc291cmNlKEhBTkRMRSBpbnN0YW5jZSwgSEFORExFIGhSZXNJbmZvKQogewotICAgIGZwcmludGYoc3RkZXJyLCJMb2FkUmVzb3VyY2U6ICglZCksJWRcbiIsaW5zdGFuY2UsIGhSZXNJbmZvKTsKLSAgICByZXR1cm4gOworICAgIFJFU09VUkNFICpyOworICAgIGludCBpbWFnZV9zaXplOworICAgIHZvaWQgKmltYWdlOworICAgIEhBTkRMRSBoOworCisgICAgaWYgKGluc3RhbmNlID09IDApCisJcmV0dXJuIDA7CisgICAgCisgICAgaWYgKE9wZW5SZXNvdXJjZUZpbGUoaW5zdGFuY2UpIDwgMCkKKwlyZXR1cm4gMDsKKworICAgIHIgPSAoUkVTT1VSQ0UgKilHbG9iYWxMb2NrKGhSZXNJbmZvKTsKKyAgICBpZiAociA9PSBOVUxMKQorCXJldHVybiAwOworICAgIAorICAgIGltYWdlX3NpemUgPSByLT5uYW1laW5mby5sZW5ndGggPDwgci0+c2l6ZV9zaGlmdDsKKworICAgIGggPSByLT5yc2NfbWVtID0gR2xvYmFsQWxsb2MoR01FTV9NT1ZFQUJMRSwgaW1hZ2Vfc2l6ZSk7CisgICAgaW1hZ2UgPSBHbG9iYWxMb2NrKGgpOworCisgICAgaWYgKGltYWdlID09IE5VTEwgfHwgcmVhZChSZXNvdXJjZUZkLCBpbWFnZSwgaW1hZ2Vfc2l6ZSkgIT0gaW1hZ2Vfc2l6ZSkKKyAgICB7CisJR2xvYmFsRnJlZShoKTsKKwlHbG9iYWxVbmxvY2soaFJlc0luZm8pOworCXJldHVybiAwOworICAgIH0KKworICAgIEdsb2JhbFVubG9jayhoKTsKKyAgICBHbG9iYWxVbmxvY2soaFJlc0luZm8pOworICAgIHJldHVybiBoOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzE0LDE5ICs2NjEsNTEgQEAKICAqLwogTFBTVFIgTG9ja1Jlc291cmNlKEhBTkRMRSBoUmVzRGF0YSkKIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwiTG9ja1Jlc291cmNlOiAlZFxuIiwgaFJlc0RhdGEpOwotICAgIHJldHVybiA7CisgICAgcmV0dXJuIEdsb2JhbExvY2soaFJlc0RhdGEpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJRnJlZVJlc291cmNlCVtLRVJORUwuNjNdCiAgKi8KLUJPT0wgRnJlZVJlc291cmNlKEhBTkRMRSBoUmVzRGF0YSkKK0hBTkRMRSBGcmVlUmVzb3VyY2UoSEFORExFIGhSZXNEYXRhKQogewotICAgIGZwcmludGYoc3RkZXJyLCJGcmVlUmVzb3VyY2U6ICVkXG4iLCBoUmVzRGF0YSk7Ci0gICAgcmV0dXJuIDsKKyAgICBSRVNPVVJDRSAqciwgKnJwOworICAgIAorICAgIGZvciAociA9IHJwID0gVG9wOyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQorICAgIHsKKwlpZiAoci0+aW5mb19tZW0gPT0gaFJlc0RhdGEpCisJeworCSAgICBpZiAocnAgIT0gTlVMTCkKKwkJcnAtPm5leHQgPSByLT5uZXh0OworCSAgICBlbHNlCisJCVRvcCA9IHItPm5leHQ7CisJICAgIAorCSAgICBHbG9iYWxGcmVlKHItPnJzY19tZW0pOworCSAgICBHbG9iYWxGcmVlKHItPmluZm9fbWVtKTsKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gaFJlc0RhdGE7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQlBY2Nlc3NSZXNvdXJjZQlbS0VSTkVMLjY0XQorICovCitpbnQgQWNjZXNzUmVzb3VyY2UoSEFORExFIGluc3RhbmNlLCBIQU5ETEUgaFJlc0luZm8pCit7CisgICAgaW50CXJlc2ZpbGU7CisjaWZkZWYgREVCVUdfUkVTT1VSQ0UKKyAgICBwcmludGYoIkFjY2Vzc1Jlc291cmNlKCUwNFgsICUwNFgpO1xuIiwgaW5zdGFuY2UsIGhSZXNJbmZvKTsKKyNlbmRpZgorLyoKKyAgICByZXNmaWxlID0gT3BlblJlc291cmNlRmlsZShpbnN0YW5jZSk7CisgICAgcmV0dXJuIHJlc2ZpbGU7CisqLworICAgIHJldHVybiAtIDE7Cit9CisKKwogDAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQlSU0NfTG9hZFJlc291cmNlCkBAIC0zNjUsOSArNzQ0LDEwIEBACiAgICAgewogCXNpemVfc2hpZnQgPSBGaW5kUmVzb3VyY2VCeU5hbWUoJm5hbWVpbmZvLCB0eXBlLCByc2NfbmFtZSk7CiAgICAgfQotICAgIGlmIChzaXplX3NoaWZ0ID09IC0xKQorICAgIGlmIChzaXplX3NoaWZ0ID09IC0xKSB7CisgICAgCXByaW50ZigiUlNDX0xvYWRSZXNvdXJjZSAvIFJlc291cmNlICclWCcgbm90IEZvdW5kICFcbiIsIHJzY19uYW1lKTsKIAlyZXR1cm4gMDsKLQorCX0KICAgICAvKgogICAgICAqIFJlYWQgcmVzb3VyY2UuCiAgICAgICovCkBAIC00MDYsMTUgKzc4NiwxNSBAQAogCSAgIGluc3RhbmNlLCByZXNvdXJjZV9pZCwgYnVmZmVyLCBidWZsZW4pOwogI2VuZGlmCiAKLSAgICBobWVtID0gUlNDX0xvYWRSZXNvdXJjZShpbnN0YW5jZSwgKGNoYXIgKikgKHJlc291cmNlX2lkID4+IDQpLAorICAgIGhtZW0gPSBSU0NfTG9hZFJlc291cmNlKGluc3RhbmNlLCAoY2hhciAqKSAoKHJlc291cmNlX2lkID4+IDQpICsgMSksCiAJCQkgICAgTkVfUlNDVFlQRV9TVFJJTkcsICZyc2Nfc2l6ZSk7CiAgICAgaWYgKGhtZW0gPT0gMCkKIAlyZXR1cm4gMDsKICAgICAKICAgICBwID0gR2xvYmFsTG9jayhobWVtKTsKICAgICBzdHJpbmdfbnVtID0gcmVzb3VyY2VfaWQgJiAweDAwMGY7Ci0gICAgZm9yIChpID0gMDsgaSA8IHJlc291cmNlX2lkOyBpKyspCi0JcCArPSAqcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaW5nX251bTsgaSsrKQorCXAgKz0gKnAgKyAxOwogICAgIAogICAgIGkgPSBNSU4oYnVmbGVuIC0gMSwgKnApOwogICAgIG1lbWNweShidWZmZXIsIHAgKyAxLCBpKTsKQEAgLTQ0NSw3ICs4MjUsNiBAQAogewogICAgIEhCSVRNQVAgaGJpdG1hcDsKICAgICBIQU5ETEUgcnNjX21lbTsKLSAgICBHRElPQkpIRFIgKiBwdHI7CiAgICAgSERDIGhkYzsKICAgICBsb25nICpscDsKICAgICBpbnQgaW1hZ2Vfc2l6ZTsKQEAgLTQ1NCwxMSArODMzLDIwIEBACiAgICAgcHJpbnRmKCJMb2FkQml0bWFwOiBpbnN0YW5jZSA9ICUwNHgsIG5hbWUgPSAlMDh4XG4iLAogCSAgIGluc3RhbmNlLCBibXBfbmFtZSk7CiAjZW5kaWYKKyAgICBwcmludGYoIkxvYWRCaXRtYXA6IGluc3RhbmNlID0gJTA0eCwgbmFtZSA9ICUwOHhcbiIsCisJICAgaW5zdGFuY2UsIGJtcF9uYW1lKTsKICAgICAKLSAgICBpZiAoIShoZGMgPSBHZXREQyggMCApKSkgcmV0dXJuIDA7CisgICAgaWYgKGluc3RhbmNlID09IChIQU5ETEUpTlVMTCkgIGluc3RhbmNlID0gaFN5c1JlczsKKyAgICBpZiAoIShoZGMgPSBHZXREQyhHZXREZXNrdG9wV2luZG93KCkpKSkgcmV0dXJuIDA7CiAKK3ByaW50ZigiYmVmb3JlIFJTQ19Mb2FkXG4iKTsKICAgICByc2NfbWVtID0gUlNDX0xvYWRSZXNvdXJjZShpbnN0YW5jZSwgYm1wX25hbWUsIE5FX1JTQ1RZUEVfQklUTUFQLCAKIAkJCSAgICAgICAmaW1hZ2Vfc2l6ZSk7CisgICAgaWYgKHJzY19tZW0gPT0gKEhBTkRMRSlOVUxMKSB7CisJcHJpbnRmKCJMb2FkQml0bWFwIC8gQml0TWFwICUwNFggbm90IEZvdW5kICFcbiIsIGJtcF9uYW1lKTsKKwlyZXR1cm4gMDsKKwl9CitwcmludGYoImJlZm9yZSBHbG9iYWxMb2NrXG4iKTsKICAgICBscCA9IChsb25nICopIEdsb2JhbExvY2socnNjX21lbSk7CiAgICAgaWYgKGxwID09IE5VTEwpCiAgICAgewpAQCAtNDcwLDcgKzg1OCw3IEBACiAgICAgZWxzZSBpZiAoKmxwID09IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKSkKIAloYml0bWFwID0gQ29udmVydEluZm9CaXRtYXAoIGhkYywgKEJJVE1BUElORk8gKikgbHAgKTsKICAgICBlbHNlIGhiaXRtYXAgPSAwOwotCitwcmludGYoIkxvYWRCaXRtYXAgJTA0WFxuIiwgaGJpdG1hcCk7CiAgICAgR2xvYmFsRnJlZShyc2NfbWVtKTsKICAgICBSZWxlYXNlREMoIDAsIGhkYyApOwogICAgIHJldHVybiBoYml0bWFwOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL3NlbGVjdG9yLmMgYi9sb2FkZXIvc2VsZWN0b3IuYwppbmRleCA0ODlkZmQ2Li5mMDkxZDFkIDEwMDY0NAotLS0gYS9sb2FkZXIvc2VsZWN0b3IuYworKysgYi9sb2FkZXIvc2VsZWN0b3IuYwpAQCAtMzgsNTIgKzM4LDI2MCBAQAogI2RlZmluZSBVVEVYVFNFTCAweDFmCiAjZW5kaWYKIAotI2RlZmluZSBNQVhfU0VMRUNUT1JTCTUxMgotCiBzdGF0aWMgc3RydWN0IHNlZ21lbnRfZGVzY3JpcHRvcl9zICogRW52aXJvbm1lbnRTZWxlY3RvciA9ICBOVUxMOwogc3RhdGljIHN0cnVjdCBzZWdtZW50X2Rlc2NyaXB0b3JfcyAqIFBTUF9TZWxlY3RvciA9IE5VTEw7CiBzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yX3MgKiBNYWtlUHJvY1RodW5rcyA9IE5VTEw7CiB1bnNpZ25lZCBzaG9ydCBQU1BTZWxlY3RvcjsKIHVuc2lnbmVkIGNoYXIgcmFuX291dCA9IDA7CiB1bnNpZ25lZCBzaG9ydCBTZWxlY3Rvck93bmVyc1tNQVhfU0VMRUNUT1JTXTsKK3Vuc2lnbmVkIHNob3J0IFNlbGVjdG9yTWFwW01BWF9TRUxFQ1RPUlNdOwordW5zaWduZWQgc2hvcnQgU2VsZWN0b3JMaW1pdHNbTUFYX1NFTEVDVE9SU107Cit1bnNpZ25lZCBjaGFyICBTZWxlY3RvclR5cGVzW01BWF9TRUxFQ1RPUlNdOworaW50IExhc3RVc2VkU2VsZWN0b3IgPSBGSVJTVF9TRUxFQ1RPUiAtIDE7CiAKLXN0YXRpYyBpbnQgbmV4dF91bnVzZWRfc2VsZWN0b3IgPSBGSVJTVF9TRUxFQ1RPUjsKKyNpZmRlZiBERVZfWkVSTworICAgIHN0YXRpYyBGSUxFICp6ZmlsZSA9IE5VTEw7CisjZW5kaWYgICAgCisKIGV4dGVybiB2b2lkIEtFUk5FTF9PcmRpbmFsXzEwMigpOwogZXh0ZXJuIHZvaWQgVU5JWExJQl9PcmRpbmFsXzAoKTsKIAogZXh0ZXJuIGNoYXIgKipBcmd2OwogZXh0ZXJuIGludCBBcmdjOwotCisMCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJCUdldE5leHRTZWdtZW50CisgKgkJCQkJRmluZFVudXNlZFNlbGVjdG9yCisgKi8KK2ludAorRmluZFVudXNlZFNlbGVjdG9yKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgCisgICAgZm9yIChpID0gTGFzdFVzZWRTZWxlY3RvciArIDE7IGkgIT0gTGFzdFVzZWRTZWxlY3RvcjsgaSsrKQorICAgIHsKKwlpZiAoaSA+PSBNQVhfU0VMRUNUT1JTKQorCSAgICBpID0gRklSU1RfU0VMRUNUT1I7CisJCisJaWYgKCFTZWxlY3Rvck1hcFtpXSkKKwkgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGlmIChpID09IExhc3RVc2VkU2VsZWN0b3IpCisJcmV0dXJuIDA7CisKKyAgICBMYXN0VXNlZFNlbGVjdG9yID0gaTsKKyAgICByZXR1cm4gaTsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJQWxsb2NTZWxlY3RvcgorICoKKyAqIFRoaXMgaXMgdmVyeSBiYWQhISEgIFRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgZm9yIFdpbmRvd3MKKyAqIGNvbXBhdGliaWxpdHkgb25seS4gIERvIG5vdCBjYWxsIHRoaXMgZnJvbSB0aGUgZW11bGF0aW9uIGxpYnJhcnkuCisgKi8KK3Vuc2lnbmVkIGludAorQWxsb2NTZWxlY3Rvcih1bnNpZ25lZCBpbnQgb2xkX3NlbGVjdG9yKQoreworICAgIGludCBpX25ldywgaV9vbGQ7CisgICAgbG9uZyBiYXNlOworICAgIAorICAgIGlfbmV3ID0gRmluZFVudXNlZFNlbGVjdG9yKCk7CisgICAgaWYgKG9sZF9zZWxlY3RvcikKKyAgICB7CisJaV9vbGQgPSAob2xkX3NlbGVjdG9yID4+IDMpOworCVNlbGVjdG9yTWFwW2lfbmV3XSA9IGlfb2xkOworCWJhc2UgPSBTQUZFTUFLRVBUUihvbGRfc2VsZWN0b3IsIDApOworCWlmIChzZXRfbGR0X2VudHJ5KGlfbmV3LCBiYXNlLCAKKwkJCSAgU2VsZWN0b3JMaW1pdHNbaV9vbGRdLCAwLCAKKwkJCSAgU2VsZWN0b3JUeXBlc1tpX29sZF0sIDAsIDApIDwgMCkKKwl7CisJICAgIHJldHVybiAwOworCX0KKworCVNlbGVjdG9yTGltaXRzW2lfbmV3XSA9IFNlbGVjdG9yTGltaXRzW2lfb2xkXTsKKwlTZWxlY3RvclR5cGVzW2lfbmV3XSAgPSBTZWxlY3RvclR5cGVzW2lfb2xkXTsKKwlTZWxlY3Rvck1hcFtpX25ld10gICAgPSBTZWxlY3Rvck1hcFtpX29sZF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJU2VsZWN0b3JNYXBbaV9uZXddID0gaV9uZXc7CisgICAgfQorCisgICAgcmV0dXJuIGlfbmV3OworfQorDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCQlQcmVzdG9DaGFuZ29TZWxlY3RvcgorICoKKyAqIFRoaXMgaXMgdmVyeSBiYWQhISEgIFRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgZm9yIFdpbmRvd3MKKyAqIGNvbXBhdGliaWxpdHkgb25seS4gIERvIG5vdCBjYWxsIHRoaXMgZnJvbSB0aGUgZW11bGF0aW9uIGxpYnJhcnkuCisgKi8KK3Vuc2lnbmVkIGludCBQcmVzdG9DaGFuZ29TZWxlY3Rvcih1bnNpZ25lZCBzcmNfc2VsZWN0b3IsIHVuc2lnbmVkIGRzdF9zZWxlY3RvcikKK3sKKyAgICBsb25nIGRzdF9iYXNlLCBzcmNfYmFzZTsKKyAgICBjaGFyICpwOworICAgIGludCBzcmNfaWR4LCBkc3RfaWR4OworICAgIGludCBhbGlhc19jb3VudDsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBzcmNfaWR4ID0gKFNlbGVjdG9yTWFwW3NyY19zZWxlY3RvciA+PiAzXSk7CisgICAgZHN0X2lkeCA9IGRzdF9zZWxlY3RvciA+PiAzOworICAgIHNyY19iYXNlID0gKHNyY19pZHggPDwgMTkpIHwgMHg3MDAwMDsKKyAgICBkc3RfYmFzZSA9IChkc3RfaWR4IDw8IDE5KSB8IDB4NzAwMDA7CisKKyAgICBhbGlhc19jb3VudCA9IDA7CisgICAgZm9yIChpID0gRklSU1RfU0VMRUNUT1I7IGkgPCBNQVhfU0VMRUNUT1JTOyBpKyspCisJaWYgKFNlbGVjdG9yTWFwW2ldID09IHNyY19pZHgpCisJICAgIGFsaWFzX2NvdW50Kys7CisgICAgCisgICAgaWYgKFNlbGVjdG9yVHlwZXNbc3JjX2lkeF0gPT0gTU9ESUZZX0xEVF9DT05URU5UU19EQVRBIAorCXx8IGFsaWFzX2NvdW50ID4gMSB8fCBzcmNfaWR4ID09IGRzdF9pZHgpCisgICAgeworCWlmIChTZWxlY3RvclR5cGVzW3NyY19pZHhdID09IE1PRElGWV9MRFRfQ09OVEVOVFNfREFUQSkKKwkgICAgU2VsZWN0b3JUeXBlc1tkc3RfaWR4XSA9IE1PRElGWV9MRFRfQ09OVEVOVFNfQ09ERTsKKwllbHNlCisJICAgIFNlbGVjdG9yVHlwZXNbZHN0X2lkeF0gPSBNT0RJRllfTERUX0NPTlRFTlRTX0RBVEE7CisKKwlTZWxlY3Rvck1hcFtkc3RfaWR4XSA9IFNlbGVjdG9yTWFwW3NyY19pZHhdOworCVNlbGVjdG9yTGltaXRzW2RzdF9pZHhdID0gU2VsZWN0b3JMaW1pdHNbc3JjX2lkeF07CisJaWYgKHNldF9sZHRfZW50cnkoZHN0X2lkeCwgc3JjX2Jhc2UsCisJCQkgIFNlbGVjdG9yTGltaXRzW2RzdF9pZHhdLCAwLCAKKwkJCSAgU2VsZWN0b3JUeXBlc1tkc3RfaWR4XSwgMCwgMCkgPCAwKQorCXsKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgICBlbHNlCisgICAgeworCS8qCisJICogV2UncmUgY2hhbmdpbmcgYW4gdW5hbGlhc2VkIGNvZGUgc2VnbWVudCBpbnRvIGEgZGF0YQorCSAqIHNlZ21lbnQuICBUaGUgU0FGRVNUIChidXQgdWdsaWVzdCkgd2F5IHRvIGRlYWwgd2l0aCAKKwkgKiB0aGlzIGlzIHRvIG1hcCB0aGUgbmV3IHNlZ21lbnQgYW5kIGNvcHkgYWxsIHRoZSBjb250ZW50cy4KKwkgKi8KKwlTZWxlY3RvclR5cGVzW2RzdF9pZHhdID0gTU9ESUZZX0xEVF9DT05URU5UU19EQVRBOworCVNlbGVjdG9yTWFwW2RzdF9pZHhdID0gU2VsZWN0b3JNYXBbc3JjX2lkeF07CisJU2VsZWN0b3JMaW1pdHNbZHN0X2lkeF0gPSBTZWxlY3RvckxpbWl0c1tzcmNfaWR4XTsKKyNpZmRlZiBERVZfWkVSTworCWlmICh6ZmlsZSA9PSBOVUxMKQorCSAgICB6ZmlsZSA9IGZvcGVuKCIvZGV2L3plcm8iLCJyIik7CisJcCA9ICh2b2lkICopIG1tYXAoKGNoYXIgKikgZHN0X2Jhc2UsCisJCQkgICgoU2VsZWN0b3JMaW1pdHNbZHN0X2lkeF0gKyBQQUdFX1NJWkUpIAorCQkJICAgJiB+KFBBR0VfU0laRSAtIDEpKSwKKwkJCSAgUFJPVF9FWEVDIHwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCSAgTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUsIGZpbGVubyh6ZmlsZSksIDApOworI2Vsc2UKKwlwID0gKHZvaWQgKikgbW1hcCgoY2hhciAqKSBkc3RfYmFzZSwKKwkJCSAgKChTZWxlY3RvckxpbWl0c1tkc3RfaWR4XSArIFBBR0VfU0laRSkgCisJCQkgICAmIH4oUEFHRV9TSVpFIC0gMSkpLAorCQkJICBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkJICBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OLCAtMSwgMCk7CisjZW5kaWYKKwlpZiAocCA9PSBOVUxMKQorCSAgICByZXR1cm4gMDsKKwkKKwltZW1jcHkoKHZvaWQgKikgZHN0X2Jhc2UsICh2b2lkICopIHNyY19iYXNlLCAKKwkgICAgICAgU2VsZWN0b3JMaW1pdHNbZHN0X2lkeF0gKyAxKTsKKwlpZiAoc2V0X2xkdF9lbnRyeShzcmNfaWR4LCBkc3RfYmFzZSwKKwkJCSAgU2VsZWN0b3JMaW1pdHNbZHN0X2lkeF0sIDAsIAorCQkJICBTZWxlY3RvclR5cGVzW2RzdF9pZHhdLCAwLCAwKSA8IDApCisJeworCSAgICByZXR1cm4gMDsKKwl9CisJaWYgKHNldF9sZHRfZW50cnkoZHN0X2lkeCwgZHN0X2Jhc2UsCisJCQkgIFNlbGVjdG9yTGltaXRzW2RzdF9pZHhdLCAwLCAKKwkJCSAgU2VsZWN0b3JUeXBlc1tkc3RfaWR4XSwgMCwgMCkgPCAwKQorCXsKKwkgICAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICAgIHJldHVybiAoZHN0X2lkeCA8PCAzKSB8IDB4MDAwNzsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJQWxsb2NDU3RvRFNBbGlhcworICovCitBbGxvY0RTdG9DU0FsaWFzKHVuc2lnbmVkIGludCBkc19zZWxlY3RvcikKK3sKKyAgICB1bnNpZ25lZCBpbnQgY3Nfc2VsZWN0b3I7CisgICAgCisgICAgaWYgKGRzX3NlbGVjdG9yID09IDApCisJcmV0dXJuIDA7CisgICAgCisgICAgY3Nfc2VsZWN0b3IgPSBBbGxvY1NlbGVjdG9yKDApOworICAgIHJldHVybiBQcmVzdG9DaGFuZ29TZWxlY3Rvcihkc19zZWxlY3RvciwgY3Nfc2VsZWN0b3IpOworfQorDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCQlGcmVlU2VsZWN0b3IKKyAqLwordW5zaWduZWQgaW50IEZyZWVTZWxlY3Rvcih1bnNpZ25lZCBpbnQgc2VsKQoreworICAgIGludCBzZWxfaWR4OworICAgIGludCBhbGlhc19jb3VudDsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBzZWxfaWR4ID0gU2VsZWN0b3JNYXBbc2VsID4+IDNdOworCisgICAgaWYgKHNlbF9pZHggIT0gKHNlbCA+PiAzKSkKKyAgICB7CisJU2VsZWN0b3JNYXBbc2VsID4+IDNdID0gMDsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgCisgICAgYWxpYXNfY291bnQgPSAwOworICAgIGZvciAoaSA9IEZJUlNUX1NFTEVDVE9SOyBpIDwgTUFYX1NFTEVDVE9SUzsgaSsrKQorCWlmIChTZWxlY3Rvck1hcFtpXSA9PSBzZWxfaWR4KQorCSAgICBhbGlhc19jb3VudCsrOworCisgICAgaWYgKGFsaWFzX2NvdW50ID09IDEpCisgICAgeworCW11bm1hcCgoY2hhciAqKSAoc2VsIDw8IDE2KSwgCisJICAgICAgICgoU2VsZWN0b3JMaW1pdHNbc2VsX2lkeF0gKyBQQUdFX1NJWkUpICYgfihQQUdFX1NJWkUgLSAxKSkpOworCVNlbGVjdG9yTWFwW3NlbCA+PiAzXSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCUNyZWF0ZU5ld1NlZ21lbnQKICAqLwogc3RydWN0IHNlZ21lbnRfZGVzY3JpcHRvcl9zICoKLUdldE5leHRTZWdtZW50KHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50IGxpbWl0KQorQ3JlYXRlTmV3U2VnbWVudChpbnQgY29kZV9mbGFnLCBpbnQgcmVhZF9vbmx5LCBpbnQgbGVuZ3RoKQogewotICAgIHN0cnVjdCBzZWdtZW50X2Rlc2NyaXB0b3JfcyAqc2VsZWN0b3JzLCAqczsKLSAgICBpbnQgc2VsX2lkeDsKLSNpZmRlZiBERVZfWkVSTwotICAgIEZJTEUgKnpmaWxlOwotI2VuZGlmCi0KLSAgICBzZWxfaWR4ID0gbmV4dF91bnVzZWRfc2VsZWN0b3IrKzsKKyAgICBzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yX3MgKnM7CisgICAgaW50IGNvbnRlbnRzOworICAgIGludCBpOworICAgIAorICAgIGkgPSBGaW5kVW51c2VkU2VsZWN0b3IoKTsKIAogICAgIC8qCiAgICAgICogRmlsbCBpbiBzZWxlY3RvciBpbmZvLgogICAgICAqLwogICAgIHMgPSBtYWxsb2Moc2l6ZW9mKCpzKSk7Ci0gICAgcy0+ZmxhZ3MgPSBORV9TRUdGTEFHU19EQVRBOwotICAgIHMtPnNlbGVjdG9yID0gKHNlbF9pZHggPDwgMykgfCAweDAwMDc7Ci0gICAgcy0+bGVuZ3RoID0gbGltaXQ7CisgICAgaWYgKGNvZGVfZmxhZykKKyAgICB7CisJY29udGVudHMgPSBNT0RJRllfTERUX0NPTlRFTlRTX0NPREU7CisJcy0+ZmxhZ3MgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworCWNvbnRlbnRzID0gTU9ESUZZX0xEVF9DT05URU5UU19EQVRBOworCXMtPmZsYWdzID0gTkVfU0VHRkxBR1NfREFUQTsKKyAgICB9CisgICAgCisgICAgcy0+c2VsZWN0b3IgPSAoaSA8PCAzKSB8IDB4MDAwNzsKKyAgICBzLT5sZW5ndGggPSBsZW5ndGg7CiAjaWZkZWYgREVWX1pFUk8KLSAgICB6ZmlsZSA9IGZvcGVuKCIvZGV2L3plcm8iLCJyIik7CisgICAgaWYgKHpmaWxlID09IE5VTEwpCisJemZpbGUgPSBmb3BlbigiL2Rldi96ZXJvIiwiciIpOwogICAgIHMtPmJhc2VfYWRkciA9ICh2b2lkICopIG1tYXAoKGNoYXIgKikgKHMtPnNlbGVjdG9yIDw8IDE2KSwKIAkJCQkgKChzLT5sZW5ndGggKyBQQUdFX1NJWkUgLSAxKSAmIAogCQkJCSAgfihQQUdFX1NJWkUgLSAxKSksCiAJCQkJIFBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiAJCQkJIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFLCBmaWxlbm8oemZpbGUpLCAwKTsKIAotICAgIGZjbG9zZSh6ZmlsZSk7CiAjZWxzZQogICAgIHMtPmJhc2VfYWRkciA9ICh2b2lkICopIG1tYXAoKGNoYXIgKikgKHMtPnNlbGVjdG9yIDw8IDE2KSwKIAkJCQkgKChzLT5sZW5ndGggKyBQQUdFX1NJWkUgLSAxKSAmIApAQCAtOTMsMTggKzMwMSwzMCBAQAogCiAjZW5kaWYKIAotICAgIGlmIChzZXRfbGR0X2VudHJ5KHNlbF9pZHgsICh1bnNpZ25lZCBsb25nKSBzLT5iYXNlX2FkZHIsIAorICAgIGlmIChzZXRfbGR0X2VudHJ5KGksICh1bnNpZ25lZCBsb25nKSBzLT5iYXNlX2FkZHIsIAogCQkgICAgICAocy0+bGVuZ3RoIC0gMSkgJiAweGZmZmYsIDAsIAotCQkgICAgICBNT0RJRllfTERUX0NPTlRFTlRTX0RBVEEsIDAsIDApIDwgMCkKKwkJICAgICAgY29udGVudHMsIHJlYWRfb25seSwgMCkgPCAwKQogICAgIHsKLQluZXh0X3VudXNlZF9zZWxlY3Rvci0tOwogCWZyZWUocyk7CiAJcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgU2VsZWN0b3JNYXBbaV0gPSAodW5zaWduZWQgc2hvcnQpIGk7CisgICAgU2VsZWN0b3JMaW1pdHNbaV0gPSBzLT5sZW5ndGggLSAxOworICAgIFNlbGVjdG9yVHlwZXNbaV0gPSBjb250ZW50czsKKyAgICAKICAgICByZXR1cm4gczsKIH0KLQorDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCQlHZXROZXh0U2VnbWVudAorICovCitzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yX3MgKgorR2V0TmV4dFNlZ21lbnQodW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgbGltaXQpCit7CisgICAgcmV0dXJuIENyZWF0ZU5ld1NlZ21lbnQoMCwgMCwgbGltaXQpOworfQorDAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCQkJCQlHZXRFbnRyeVBvaW50RnJvbU9yZGluYWwKICAqLwpAQCAtMjc1LDM3ICs0OTUsMTQgQEAKICAqCQkJCQlDcmVhdGVFbnZpcm9ubWVudAogICovCiBzdGF0aWMgc3RydWN0IHNlZ21lbnRfZGVzY3JpcHRvcl9zICoKLSNpZmRlZiBERVZfWkVSTwotQ3JlYXRlRW52aXJvbm1lbnQoRklMRSAqemZpbGUpCi0jZWxzZQogQ3JlYXRlRW52aXJvbm1lbnQodm9pZCkKLSNlbmRpZgogewogICAgIGNoYXIgKnA7Ci0gICAgaW50IHNlbF9pZHg7CiAgICAgc3RydWN0IHNlZ21lbnRfZGVzY3JpcHRvcl9zICogczsKIAotICAgIHMgPSAoc3RydWN0IHNlZ21lbnRfZGVzY3JpcHRvcl9zICopIAotCSAgICBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZWdtZW50X2Rlc2NyaXB0b3JfcykpOwotCi0gICAgc2VsX2lkeCA9ICBuZXh0X3VudXNlZF9zZWxlY3RvcisrOwotICAgIC8qCi0gICAgICogQ3JlYXRlIG1lbW9yeSB0byBob2xkIGVudmlyb25tZW50LgotICAgICAqLwotICAgIHMtPmZsYWdzID0gTkVfU0VHRkxBR1NfREFUQTsKLSAgICBzLT5zZWxlY3RvciA9IChzZWxfaWR4IDw8IDMpIHwgMHgwMDA3OwotICAgIHMtPmxlbmd0aCA9IFBBR0VfU0laRTsKLSNpZmRlZiBERVZfWkVSTwotICAgIHMtPmJhc2VfYWRkciA9ICh2b2lkICopIG1tYXAoKGNoYXIgKikgKHMtPnNlbGVjdG9yIDw8IDE2KSwKLQkJCQkgUEFHRV9TSVpFLAotCQkJCSBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJCSBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwgZmlsZW5vKHpmaWxlKSwgMCk7Ci0jZWxzZQotICAgIHMtPmJhc2VfYWRkciA9ICh2b2lkICopIG1tYXAoKGNoYXIgKikgKHMtPnNlbGVjdG9yIDw8IDE2KSwKLQkJCQkgUEFHRV9TSVpFLAotCQkJCSBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJCSBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OLCAtMSwgMCk7Ci0jZW5kaWYKKyAgICBzID0gQ3JlYXRlTmV3U2VnbWVudCgwLCAwLCBQQUdFX1NJWkUpOworICAgIGlmIChzID09IE5VTEwpCisJcmV0dXJuIE5VTEw7CiAKICAgICAvKgogICAgICAqIEZpbGwgZW52aXJvbm1lbnQgd2l0aCBtZWFuaW5nbGVzcyBiYWJibGUuCkBAIC0zMTgsNjMgKzUxNSw2IEBACiAgICAgKnArKyA9IDA7CiAgICAgc3RyY3B5KHAsICJDOlxcVEVTVC5FWEUiKTsKIAotICAgIC8qCi0gICAgICogQ3JlYXRlIGVudHJ5IGluIExEVCBmb3IgdGhpcyBzZWdtZW50LgotICAgICAqLwotICAgIGlmIChzZXRfbGR0X2VudHJ5KHNlbF9pZHgsICh1bnNpZ25lZCBsb25nKSBzLT5iYXNlX2FkZHIsIAotCQkgICAgICAocy0+bGVuZ3RoIC0gMSkgJiAweGZmZmYsIDAsIAotCQkgICAgICBNT0RJRllfTERUX0NPTlRFTlRTX0RBVEEsIDAsIDApIDwgMCkKLSAgICB7Ci0JbXllcnJvcigiQ291bGQgbm90IGNyZWF0ZSBMRFQgZW50cnkgZm9yIGVudmlyb25tZW50Iik7Ci0gICAgfQotICAgIHJldHVybiAgczsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQkJQ3JlYXRlVGh1bmtzCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yX3MgKgotI2lmZGVmIERFVl9aRVJPCi1DcmVhdGVUaHVua3MoRklMRSAqemZpbGUpCi0jZWxzZQotQ3JlYXRlVGh1bmtzKHZvaWQpCi0jZW5kaWYKLXsKLSAgICBpbnQgc2VsX2lkeDsKLSAgICBzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yX3MgKiBzOwotCi0gICAgcyA9IChzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yX3MgKikgCi0JICAgIG1hbGxvYyhzaXplb2Yoc3RydWN0IHNlZ21lbnRfZGVzY3JpcHRvcl9zKSk7Ci0KLSAgICBzZWxfaWR4ID0gIG5leHRfdW51c2VkX3NlbGVjdG9yKys7Ci0gICAgLyoKLSAgICAgKiBDcmVhdGUgbWVtb3J5IHRvIGhvbGQgZW52aXJvbm1lbnQuCi0gICAgICovCi0gICAgcy0+ZmxhZ3MgPSAwOwotICAgIHMtPnNlbGVjdG9yID0gKHNlbF9pZHggPDwgMykgfCAweDAwMDc7Ci0gICAgcy0+bGVuZ3RoID0gMHgxMDAwMDsKLSNpZmRlZiBERVZfWkVSTwotICAgIHMtPmJhc2VfYWRkciA9ICh2b2lkICopIG1tYXAoKGNoYXIgKikgKHMtPnNlbGVjdG9yIDw8IDE2KSwKLQkJCQkgcy0+bGVuZ3RoLAotCQkJCSBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJCSBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwgZmlsZW5vKHpmaWxlKSwgMCk7Ci0jZWxzZQotICAgIHMtPmJhc2VfYWRkciA9ICh2b2lkICopIG1tYXAoKGNoYXIgKikgKHMtPnNlbGVjdG9yIDw8IDE2KSwKLQkJCQkgcy0+bGVuZ3RoLAotCQkJCSBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJCSBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OLCAtMSwgMCk7Ci0jZW5kaWYKLQotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgZW50cnkgaW4gTERUIGZvciB0aGlzIHNlZ21lbnQuCi0gICAgICovCi0gICAgaWYgKHNldF9sZHRfZW50cnkoc2VsX2lkeCwgKHVuc2lnbmVkIGxvbmcpIHMtPmJhc2VfYWRkciwgCi0JCSAgICAgIChzLT5sZW5ndGggLSAxKSAmIDB4ZmZmZiwgMCwgCi0JCSAgICAgIE1PRElGWV9MRFRfQ09OVEVOVFNfQ09ERSwgMCwgMCkgPCAwKQotICAgIHsKLQlteWVycm9yKCJDb3VsZCBub3QgY3JlYXRlIExEVCBlbnRyeSBmb3IgdGh1bmtzIik7Ci0gICAgfQogICAgIHJldHVybiAgczsKIH0KIAwKQEAgLTM4Miw0MCArNTIyLDE1IEBACiAgKgkJCQkJQ3JlYXRlUFNQCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yX3MgKgotI2lmZGVmIERFVl9aRVJPCi1DcmVhdGVQU1AoRklMRSAqemZpbGUpCi0jZWxzZQogQ3JlYXRlUFNQKHZvaWQpCi0jZW5kaWYKIHsKICAgICBzdHJ1Y3QgZG9zX3BzcF9zICpwc3A7CiAgICAgdW5zaWduZWQgc2hvcnQgKnVzcDsKLSAgICBpbnQgc2VsX2lkeDsKICAgICBzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yX3MgKiBzOwogICAgIGNoYXIgKnAxLCAqcDI7CiAgICAgaW50IGk7CiAKLSAgICBzID0gKHN0cnVjdCBzZWdtZW50X2Rlc2NyaXB0b3JfcyAqKSAKLQkgICAgbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yX3MpKTsKLSAgICAKLSAgICBzZWxfaWR4ID0gIG5leHRfdW51c2VkX3NlbGVjdG9yKys7Ci0gICAgLyoKLSAgICAgKiBDcmVhdGUgbWVtb3J5IHRvIGhvbGQgUFNQLgotICAgICAqLwotICAgIHMtPmZsYWdzID0gTkVfU0VHRkxBR1NfREFUQTsKLSAgICBzLT5zZWxlY3RvciA9IChzZWxfaWR4IDw8IDMpIHwgMHgwMDA3OwotICAgIHMtPmxlbmd0aCA9IFBBR0VfU0laRTsKLSNpZmRlZiBERVZfWkVSTwotICAgIHMtPmJhc2VfYWRkciA9ICh2b2lkICopIG1tYXAoKGNoYXIgKikgKHMtPnNlbGVjdG9yIDw8IDE2KSwKLQkJCQkgUEFHRV9TSVpFLAotCQkJCSBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJCSBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwgZmlsZW5vKHpmaWxlKSwgMCk7Ci0jZWxzZQotICAgIHMtPmJhc2VfYWRkciA9ICh2b2lkICopIG1tYXAoKGNoYXIgKikgKHMtPnNlbGVjdG9yIDw8IDE2KSwKLQkJCQkgUEFHRV9TSVpFLAotCQkJCSBQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJCSBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OLCAtMSwgMCk7Ci0jZW5kaWYKKyAgICBzID0gQ3JlYXRlTmV3U2VnbWVudCgwLCAwLCBQQUdFX1NJWkUpOwogCiAgICAgLyoKICAgICAgKiBGaWxsIFBTUApAQCAtNDUxLDE1ICs1NjYsNiBAQAogICAgICpwMSA9ICdcMCc7CiAgICAgcHNwLT5wc3BDb21tYW5kVGFpbENvdW50ID0gc3RybGVuKHBzcC0+cHNwQ29tbWFuZFRhaWwpOwogCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgZW50cnkgaW4gTERUIGZvciB0aGlzIHNlZ21lbnQuCi0gICAgICovCi0gICAgaWYgKHNldF9sZHRfZW50cnkoc2VsX2lkeCwgKHVuc2lnbmVkIGxvbmcpIHMtPmJhc2VfYWRkciwgCi0JCSAgICAgIChzLT5sZW5ndGggLSAxKSAmIDB4ZmZmZiwgMCwgCi0JCSAgICAgIE1PRElGWV9MRFRfQ09OVEVOVFNfREFUQSwgMCwgMCkgPCAwKQotICAgIHsKLQlteWVycm9yKCJDb3VsZCBub3QgY3JlYXRlIExEVCBlbnRyeSBmb3IgUFNQIik7Ci0gICAgfQogICAgIHJldHVybiBzOwogfQogDApAQCAtNDcyLDE1ICs1NzgsMTIgQEAKICAgICBpbnQgZmQgPSB3cG50LT5mZDsKICAgICBzdHJ1Y3QgbmVfc2VnbWVudF90YWJsZV9lbnRyeV9zICpzZWdfdGFibGUgPSB3cG50LT5zZWdfdGFibGU7CiAgICAgc3RydWN0IG5lX2hlYWRlcl9zICpuZV9oZWFkZXIgPSB3cG50LT5uZV9oZWFkZXI7Ci0gICAgc3RydWN0IHNlZ21lbnRfZGVzY3JpcHRvcl9zICpzZWxlY3RvcnMsICpzOwotICAgIHVuc2lnbmVkIHNob3J0ICpzcDsKKyAgICBzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yX3MgKnNlbGVjdG9ycywgKnMsICpzdG1wOworICAgIHVuc2lnbmVkIHNob3J0IGF1dG9fZGF0YV9zZWw7CiAgICAgaW50IGNvbnRlbnRzLCByZWFkX29ubHk7CiAgICAgaW50IFNlbGVjdG9yVGFibGVMZW5ndGg7CiAgICAgaW50IGk7CiAgICAgaW50IHN0YXR1czsKLSNpZmRlZiBERVZfWkVSTwotICAgIEZJTEUgKiB6ZmlsZTsKLSNlbmRpZgogICAgIGludCBvbGRfbGVuZ3RoLCBmaWxlX2ltYWdlX2xlbmd0aDsKIAogICAgIC8qCkBAIC00OTUsMjQgKzU5OCwxMiBAQAogICAgICAqIFN0ZXAgdGhyb3VnaCB0aGUgc2VnbWVudCB0YWJsZSBpbiB0aGUgZXhlIGhlYWRlci4KICAgICAgKi8KICAgICBzID0gc2VsZWN0b3JzOwotI2lmZGVmIERFVl9aRVJPCi0gICAgemZpbGUgPSBmb3BlbigiL2Rldi96ZXJvIiwiciIpOwotI2VuZGlmCiAgICAgZm9yIChpID0gMDsgaSA8IG5lX2hlYWRlci0+bl9zZWdtZW50X3RhYjsgaSsrLCBzKyspCiAgICAgewotI2lmZGVmIERFQlVHX1NFR01FTlQKLQlwcmludGYoIiAgJTJkOiBPRkZTRVQgJTA0LjR4LCBMRU5HVEggJTA0LjR4LCAiLAotCSAgICAgICBpICsgMSwgc2VnX3RhYmxlW2ldLnNlZ19kYXRhX29mZnNldCwgCi0JICAgICAgIHNlZ190YWJsZVtpXS5zZWdfZGF0YV9sZW5ndGgpOwotCXByaW50ZigiRkxBR1MgJTA0LjR4LCBNSU4gQUxMT0MgJTA0LjR4XG4iLAotCSAgICAgICBzZWdfdGFibGVbaV0uc2VnX2ZsYWdzLCBzZWdfdGFibGVbaV0ubWluX2FsbG9jKTsKLSNlbmRpZgotCiAJLyoKIAkgKiBTdG9yZSB0aGUgZmxhZ3MgaW4gb3VyIHRhYmxlLgogCSAqLwogCXMtPmZsYWdzID0gc2VnX3RhYmxlW2ldLnNlZ19mbGFnczsKLQlzLT5zZWxlY3RvciA9ICgobmV4dF91bnVzZWRfc2VsZWN0b3IgKyBpKSA8PCAzKSB8IDB4MDAwNzsKIAogCS8qCiAJICogSXMgdGhlcmUgYW4gaW1hZ2UgZm9yIHRoaXMgc2VnbWVudCBpbiB0aGUgZmlsZT8KQEAgLTU3MCwxOSArNjYxLDEyIEBACiAJICAgIGlmIChzLT5mbGFncyAmIE5FX1NFR0ZMQUdTX0VYRUNVVEVPTkxZKQogCQlyZWFkX29ubHkgPSAxOwogCX0KLSNpZmRlZiBERVZfWkVSTyAgICAgICAgCi0Jcy0+YmFzZV9hZGRyID0KLQkgICh2b2lkICopIG1tYXAoKGNoYXIgKikgKHMtPnNlbGVjdG9yIDw8IDE2KSwKLQkJCShzLT5sZW5ndGggKyBQQUdFX1NJWkUgLSAxKSAmIH4oUEFHRV9TSVpFIC0gMSksCi0JCQlQUk9UX0VYRUMgfCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUsIGZpbGVubyh6ZmlsZSksIDApOwotI2Vsc2UKLQlzLT5iYXNlX2FkZHIgPQotCSAgKHZvaWQgKikgbW1hcCgoY2hhciAqKSAocy0+c2VsZWN0b3IgPDwgMTYpLAotCQkJKHMtPmxlbmd0aCArIFBBR0VfU0laRSAtIDEpICYgfihQQUdFX1NJWkUgLSAxKSwKLQkJCVBST1RfRVhFQyB8IFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JCQlNQVBfRklYRUQgfCBNQVBfUFJJVkFURSB8IE1BUF9BTk9OLCAtMSwgMCk7Ci0jZW5kaWYKKworCXN0bXAgPSBDcmVhdGVOZXdTZWdtZW50KCEocy0+ZmxhZ3MgJiBORV9TRUdGTEFHU19EQVRBKSwgcmVhZF9vbmx5LAorCQkJCXMtPmxlbmd0aCk7CisJcy0+YmFzZV9hZGRyID0gc3RtcC0+YmFzZV9hZGRyOworCXMtPnNlbGVjdG9yID0gc3RtcC0+c2VsZWN0b3I7CisJCiAJaWYgKHNlZ190YWJsZVtpXS5zZWdfZGF0YV9vZmZzZXQgIT0gMCkKIAl7CiAJICAgIC8qCkBAIC01OTMsNTYgKzY3NywyOCBAQAogCSAgICBpZihyZWFkKGZkLCBzLT5iYXNlX2FkZHIsIGZpbGVfaW1hZ2VfbGVuZ3RoKSAhPSBmaWxlX2ltYWdlX2xlbmd0aCkKIAkJbXllcnJvcigiVW5hYmxlIHRvIHJlYWQgc2VnbWVudCBmcm9tIGZpbGUiKTsKIAl9Ci0JLyoKLQkgKiBDcmVhdGUgZW50cnkgaW4gTERUIGZvciB0aGlzIHNlZ21lbnQuCi0JICovCi0JaWYgKHNldF9sZHRfZW50cnkocy0+c2VsZWN0b3IgPj4gMywgKHVuc2lnbmVkIGxvbmcpIHMtPmJhc2VfYWRkciwgCi0JCQkgIChzLT5sZW5ndGggLSAxKSAmIDB4ZmZmZiwgMCwgCi0JCQkgIGNvbnRlbnRzLCByZWFkX29ubHksIDApIDwgMCkKLQl7Ci0JICAgIGZyZWUoc2VsZWN0b3JzKTsKLQkgICAgZnByaW50ZihzdGRlcnIsIlJhbiBvdXQgb2YgbGR0ICBlbnRyaWVzLlxuIik7Ci0JICAgIHJhbl9vdXQrKzsKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotI2lmZGVmIERFQlVHX1NFR01FTlQKLQlwcmludGYoIiAgICAgIFNFTEVDVE9SICUwNC40eCwgJXNcbiIsCi0JICAgICAgIHMtPnNlbGVjdG9yLCAKLQkgICAgICAgY29udGVudHMgPT0gTU9ESUZZX0xEVF9DT05URU5UU19DT0RFID8gIkNPREUiIDogIkRBVEEiKTsKLSNlbmRpZgorCiAJLyoKIAkgKiBJZiB0aGlzIGlzIHRoZSBhdXRvbWF0aWMgZGF0YSBzZWdtZW50LCB0aGVuIHdlIG11c3QgaW5pdGlhbGl6ZQogCSAqIHRoZSBsb2NhbCBoZWFwLgogCSAqLwogCWlmIChpICsgMSA9PSBuZV9oZWFkZXItPmF1dG9fZGF0YV9zZWcpCiAJeworCSAgICBhdXRvX2RhdGFfc2VsID0gcy0+c2VsZWN0b3I7CiAJICAgIEhFQVBfTG9jYWxJbml0KHMtPmJhc2VfYWRkciArIG9sZF9sZW5ndGgsIAogCQkJICAgbmVfaGVhZGVyLT5sb2NhbF9oZWFwX2xlbmd0aCk7CiAJfQogICAgIH0KIAotICAgIHNwID0gJlNlbGVjdG9yT3duZXJzW25leHRfdW51c2VkX3NlbGVjdG9yXTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmVfaGVhZGVyLT5uX3NlZ21lbnRfdGFiOyBpKyspCi0JKnNwKysgPSAoKChuZXh0X3VudXNlZF9zZWxlY3RvciArIG5lX2hlYWRlci0+YXV0b19kYXRhX3NlZyAtIDEpIDw8IDMpCi0JCSB8IDB4MDAwNyk7Ci0KLSAgICBuZXh0X3VudXNlZF9zZWxlY3RvciArPSBuZV9oZWFkZXItPm5fc2VnbWVudF90YWI7CisgICAgcyA9IHNlbGVjdG9yczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmVfaGVhZGVyLT5uX3NlZ21lbnRfdGFiOyBpKyssIHMrKykKKwlTZWxlY3Rvck93bmVyc1tzLT5zZWxlY3RvciA+PiAzXSA9IGF1dG9fZGF0YV9zZWw7CiAKICAgICBpZighRW52aXJvbm1lbnRTZWxlY3RvcikgewotI2lmZGVmIERFVl9aRVJPCi0JICAgIEVudmlyb25tZW50U2VsZWN0b3IgPSBDcmVhdGVFbnZpcm9ubWVudCh6ZmlsZSk7Ci0JICAgIFBTUF9TZWxlY3RvciA9IENyZWF0ZVBTUCh6ZmlsZSk7Ci0JICAgIE1ha2VQcm9jVGh1bmtzID0gQ3JlYXRlVGh1bmtzKHpmaWxlKTsKLSNlbHNlCiAJICAgIEVudmlyb25tZW50U2VsZWN0b3IgPSBDcmVhdGVFbnZpcm9ubWVudCgpOwogCSAgICBQU1BfU2VsZWN0b3IgPSBDcmVhdGVQU1AoKTsKLQkgICAgTWFrZVByb2NUaHVua3MgPSBDcmVhdGVUaHVua3MoKTsKLSNlbmRpZgorCSAgICBNYWtlUHJvY1RodW5rcyA9IENyZWF0ZU5ld1NlZ21lbnQoMSwgMCwgMHgxMDAwMCk7CiAgICAgfTsKIAotI2lmZGVmIERFVl9aRVJPCi0gICAgZmNsb3NlKHpmaWxlKTsKLSNlbmRpZgotCiAgICAgcmV0dXJuIHNlbGVjdG9yczsKIH0KZGlmZiAtLWdpdCBhL2xvYWRlci9zaWduYWwuYyBiL2xvYWRlci9zaWduYWwuYwppbmRleCBjYzg1ZmM3Li43YjI3MjdjIDEwMDY0NAotLS0gYS9sb2FkZXIvc2lnbmFsLmMKKysrIGIvbG9hZGVyL3NpZ25hbC5jCkBAIC0xMCw3ICsxMCw4IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjZW5kaWYKLSNpbmNsdWRlIDx3aW5lLmg+CisjaW5jbHVkZSAid2luZS5oIgorI2luY2x1ZGUgInNlZ21lbS5oIgogIAogY2hhciAqIGNzdGFja1s0MDk2XTsKIHN0cnVjdCBzaWdhY3Rpb24gc2Vndl9hY3Q7CkBAIC02NCw3ICs2NSw3IEBACiAKIAkvKiAgTm93IHRha2UgYSBsb29rIGF0IHRoZSBhY3R1YWwgaW5zdHJ1Y3Rpb24gd2hlcmUgdGhlIHByb2dyYW0KIAkgICAgYm9tYmVkICovCi0JaW5zdHIgPSAoY2hhciAqKSAoKHNjcC0+c2NfY3MgPDwgMTYpIHwgKHNjcC0+c2NfZWlwICYgMHhmZmZmKSk7CisJaW5zdHIgPSAoY2hhciAqKSBTQUZFTUFLRVBUUihzY3AtPnNjX2NzLCBzY3AtPnNjX2VpcCk7CiAKIAlpZigqaW5zdHIgIT0gMHhjZCkgewogCQlmcHJpbnRmKHN0ZGVyciwKZGlmZiAtLWdpdCBhL2xvYWRlci93aW5lLmMgYi9sb2FkZXIvd2luZS5jCmluZGV4IDgyOTI4Y2EuLjcxMjQzMTcgMTAwNjQ0Ci0tLSBhL2xvYWRlci93aW5lLmMKKysrIGIvbG9hZGVyL3dpbmUuYwpAQCAtMzgsMTEgKzM4LDEzIEBACiBzdHJ1Y3QgbXpfaGVhZGVyX3MgKkN1cnJlbnRNWkhlYWRlcjsKIHN0cnVjdCBuZV9oZWFkZXJfcyAqQ3VycmVudE5FSGVhZGVyOwogaW50IEN1cnJlbnRORUZpbGU7CitISU5TVEFOQ0UgaFN5c1JlczsKIAogc3RhdGljIGNoYXIgKmRsbEV4dGVuc2lvbnNbXSA9IHsgImRsbCIsICJleGUiLCBOVUxMIH07CiBzdGF0aWMgY2hhciAqZXhlRXh0ZW5zaW9uc1tdID0geyAiZXhlIiwgTlVMTCB9Owogc3RhdGljIGNoYXIgKldpbmVQYXRoID0gTlVMTDsKIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQkJCURlYnVnUHJpbnRTdHJpbmcKICAqLwpAQCAtOTksNyArMTAxLDcgQEAKICAqCQkJCQlMb2FkSW1hZ2UKICAqIExvYWQgb25lIE5FIGZvcm1hdCBleGVjdXRhYmxlIGludG8gbWVtb3J5CiAgKi8KLUxvYWRJbWFnZShjaGFyICogZmlsZW5hbWUsICBjaGFyICogbW9kdWxlbmFtZSkKK0hJTlNUQU5DRSBMb2FkSW1hZ2UoY2hhciAqIGZpbGVuYW1lLCAgY2hhciAqIG1vZHVsZW5hbWUpCiB7CiAgICAgdW5zaWduZWQgaW50IHJlYWRfc2l6ZTsKICAgICBpbnQgaTsKQEAgLTIzNiw2ICsyMzgsNyBAQAogCiAgICAgICBmcHJpbnRmKHN0ZGVyciwiVW5hYmxlIHRvIGxvYWQ6JXNcbiIsICBidWZmKTsKICAgICB9CityZXR1cm4od3BudC0+aGluc3RhbmNlKTsKIH0KIAwKIApAQCAtMjc4LDYgKzI4MSw3IEBACiAJfQogCQogCUxvYWRJbWFnZShleGVfcGF0aCwgTlVMTCk7CisgICAgCWhTeXNSZXMgPSBMb2FkSW1hZ2UoInN5c3Jlcy5kbGwiLCBOVUxMKTsKIAkKIAlpZihyYW5fb3V0KSBleGl0KDEpOwogI2lmZGVmIERFQlVHCmRpZmYgLS1naXQgYS9tZW1vcnkvZ2xvYmFsLmMgYi9tZW1vcnkvZ2xvYmFsLmMKaW5kZXggM2VkZmJiZS4uMTY5ZWJjMyAxMDA2NDQKLS0tIGEvbWVtb3J5L2dsb2JhbC5jCisrKyBiL21lbW9yeS9nbG9iYWwuYwpAQCAtNTU1LDcgKzU1NSw3IEBACiAgICAgICogcmVhbGxvY2F0ZSB0aGUgYmxvY2suICBJZiB0aGlzIGZhaWxzLCBjYWxsIEdsb2JhbEFsbG9jKCkgdG8gZ2V0CiAgICAgICogYSBuZXcgYmxvY2suCiAgICAgICovCi0gICAgaWYgKGctPnNlcXVlbmNlID0gMCkKKyAgICBpZiAoZy0+c2VxdWVuY2UgPT0gMCkKICAgICB7CiAJTURFU0MgKipmcmVlX2xpc3Q7CiAJdm9pZCAqcDsKZGlmZiAtLWdpdCBhL21pc2MvTWFrZWZpbGUgYi9taXNjL01ha2VmaWxlCmluZGV4IGU1ZDU1NDIuLjEyMTgwZDAgMTAwNjQ0Ci0tLSBhL21pc2MvTWFrZWZpbGUKKysrIGIvbWlzYy9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKIENGTEFHUz0kKENPUFRTKSAkKERFQlVHT1BUUykgLUkkKElOQ0xVREVfRElSKQogCiBPQkpTPWRvcy5vIGtlcm5lbC5vIHVzZXIubyB4dC5vIHJlY3QubyBmaWxlLm8gc291bmQubyBlbXVsYXRlLm8gXAotICAgICBrZXlib2FyZC5vIHByb2ZpbGUubyBsc3RyLm8gZXhlYy5vCisgICAgIGtleWJvYXJkLm8gcHJvZmlsZS5vIGxzdHIubyBleGVjLm8gbWVzc2FnZS5vCiAKIGRlZmF1bHQ6IG1pc2MubwogCmRpZmYgLS1naXQgYS9taXNjL2V4ZWMuYyBiL21pc2MvZXhlYy5jCmluZGV4IGQyZTc4NjYuLjhiYmFjZTcgMTAwNjQ0Ci0tLSBhL21pc2MvZXhlYy5jCisrKyBiL21pc2MvZXhlYy5jCkBAIC00MSw3ICs0MSw3IEBACiAgICB9ICAKICAgIHN3aXRjaChmb3JrKCkpIHsKICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICBwcmludGYoIkNhbidrICdmb3JrJyBwcm9jZXNzICFcbiIpOworICAgICAgICAgcHJpbnRmKCJDYW4ndCAnZm9yaycgcHJvY2VzcyAhXG4iKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSAwOgogICAgICAgICAgcHJpbnRmKCJOZXcgcHJvY2VzcyBzdGFydGVkICFcbiIpOwpAQCAtNjgsNyArNjgsNyBAQAogICAgcHJpbnRmKCJXaW5IZWxwKCVzLCAldSwgJWx1KVxuIiwgbHBIZWxwRmlsZSwgd0NvbW1hbmQsIGR3RGF0YSk7CiAgICBzd2l0Y2goZm9yaygpKSB7CiAgICAgICBjYXNlIC0xOgotICAgICAgICAgcHJpbnRmKCJDYW4nayAnZm9yaycgcHJvY2VzcyAhXG4iKTsKKyAgICAgICAgIHByaW50ZigiQ2FuJ3QgJ2ZvcmsnIHByb2Nlc3MgIVxuIik7CiAgICAgICAgICBicmVhazsKICAgICAgIGNhc2UgMDoKICAgICAgICAgIHByaW50ZigiTmV3IHByb2Nlc3Mgc3RhcnRlZCAhXG4iKTsKZGlmZiAtLWdpdCBhL21pc2MvbWVzc2FnZS5jIGIvbWlzYy9tZXNzYWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxYjAxMgotLS0gL2Rldi9udWxsCisrKyBiL21pc2MvbWVzc2FnZS5jCkBAIC0wLDAgKzEsMjY0IEBACisvKgorICogJ1dpbmUnIE1lc3NhZ2VCb3ggZnVuY3Rpb24gaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgMTk5MyBNYXJ0aW4gQXlvdHRlCisgKi8KKworc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0IE1hcnRpbiBBeW90dGUsIDE5OTMiOworCisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImhlYXAuaCIKKyNpbmNsdWRlICJ3aW4uaCIKKworCit0eXBlZGVmIHN0cnVjdCB0YWdNU0dCT1ggeworICAgIExQU1RSCVRpdGxlOworICAgIExQU1RSCVN0cjsKKyAgICBXT1JECXdUeXBlOworICAgIFdPUkQJd1JldFZhbDsKKyAgICBCT09MCUFjdGl2ZUZsZzsKKyAgICBIV05ECWhXbmRZZXM7CisgICAgSFdORAloV25kTm87CisgICAgSFdORAloV25kQ2FuY2VsOworICAgIEhJQ09OCWhJY29uOworfSBNU0dCT1g7Cit0eXBlZGVmIE1TR0JPWCBGQVIqIExQTVNHQk9YOworCisKK0xPTkcgU3lzdGVtTWVzc2FnZUJveFByb2MoSFdORCBod25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQlNZXNzYWdlQm94ICBbVVNFUi4xXQorICovCisKK2ludCBNZXNzYWdlQm94KCBIV05EIGhXbmQsIExQU1RSIHN0ciwgTFBTVFIgdGl0bGUsIFdPUkQgdHlwZSApCit7CisgICAgSFdORCAgICAJaERsZzsKKyAgICBXTkQJICAgIAkqd25kUHRyOworICAgIFdORENMQVNTICAJd25kQ2xhc3M7CisgICAgTVNHCSAgICAJbXNnOworICAgIE1TR0JPWAltYjsKKyAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKKyAgICBwcmludGYoICJNZXNzYWdlQm94OiAnJXMnXG4iLCBzdHIgKTsKKyAgICB3bmRDbGFzcy5zdHlsZSAgICAgICAgICAgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVyA7CisgICAgd25kQ2xhc3MubHBmblduZFByb2MgICAgID0gKFdORFBST0MpU3lzdGVtTWVzc2FnZUJveFByb2M7CisgICAgd25kQ2xhc3MuY2JDbHNFeHRyYSAgICAgID0gMDsKKyAgICB3bmRDbGFzcy5jYlduZEV4dHJhICAgICAgPSAwOworICAgIHduZENsYXNzLmhJbnN0YW5jZSAgICAgICA9IHduZFB0ci0+aEluc3RhbmNlOworICAgIHduZENsYXNzLmhJY29uICAgICAgICAgICA9IChISUNPTilOVUxMOworICAgIHduZENsYXNzLmhDdXJzb3IgICAgICAgICA9IExvYWRDdXJzb3IoKEhBTkRMRSlOVUxMLCBJRENfQVJST1cpOworICAgIHduZENsYXNzLmhickJhY2tncm91bmQgICA9IEdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIKTsKKyAgICB3bmRDbGFzcy5scHN6TWVudU5hbWUgICAgPSBOVUxMOworICAgIHduZENsYXNzLmxwc3pDbGFzc05hbWUgICA9ICJNRVNTQUdFQk9YIjsKKyAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MoJnduZENsYXNzKSkgcmV0dXJuIDA7CisgICAgbWVtc2V0KCZtYiwgMCwgc2l6ZW9mKE1TR0JPWCkpOworICAgIG1iLlRpdGxlID0gdGl0bGU7CisgICAgbWIuU3RyID0gc3RyOworICAgIG1iLndUeXBlID0gdHlwZTsKKyAgICBtYi5BY3RpdmVGbGcgPSBUUlVFOworICAgIGhEbGcgPSBDcmVhdGVXaW5kb3coIk1FU1NBR0VCT1giLCB0aXRsZSwgCisgICAgCVdTX1BPUFVQIHwgV1NfRExHRlJBTUUgfCBXU19WSVNJQkxFLCAxMDAsIDE1MCwgMzIwLCAxMjAsCisgICAgCShIV05EKU5VTEwsIChITUVOVSlOVUxMLCB3bmRQdHItPmhJbnN0YW5jZSwgKExQU1RSKSZtYik7CisgICAgaWYgKGhEbGcgPT0gMCkgcmV0dXJuIDA7CisgICAgd2hpbGUoVFJVRSkgeworCWlmICghbWIuQWN0aXZlRmxnKSBicmVhazsKKwlpZiAoIUdldE1lc3NhZ2UoJm1zZywgKEhXTkQpTlVMTCwgMCwgMCkpIGJyZWFrOworCVRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyk7CisJRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOworCX0KKyAgICBwcmludGYoICJhZnRlciBNZXNzYWdlQm94ICFcbiIpOworICAgIGlmICghVW5yZWdpc3RlckNsYXNzKCJNRVNTQUdFQk9YIiwgd25kUHRyLT5oSW5zdGFuY2UpKSByZXR1cm4gMDsKKyAgICByZXR1cm4obWIud1JldFZhbCk7Cit9CisKKworCitMUE1TR0JPWCBNc2dCb3hHZXRTdG9yYWdlSGVhZGVyKEhXTkQgaHduZCkKK3sKKyAgICBXTkQgICp3bmRQdHI7CisgICAgTFBNU0dCT1ggbHBtYjsKKyAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKyAgICBpZiAod25kUHRyID09IDApIHsKKyAgICAJcHJpbnRmKCJCYWQgV2luZG93IGhhbmRsZSBvbiBNZXNzYWdlQm94ICFcbiIpOworICAgIAlyZXR1cm4gMDsKKyAgICAJfQorICAgIGxwbWIgPSAqKChMUE1TR0JPWCAqKSZ3bmRQdHItPndFeHRyYVsxXSk7CisgICAgcmV0dXJuIGxwbWI7Cit9CisKKworCisKK0xPTkcgU3lzdGVtTWVzc2FnZUJveFByb2MoSFdORCBoV25kLCBXT1JEIG1lc3NhZ2UsIFdPUkQgd1BhcmFtLCBMT05HIGxQYXJhbSkKK3sKKyAgICBXTkQJICAgICp3bmRQdHI7CisgICAgQ1JFQVRFU1RSVUNUICpjcmVhdGVTdHJ1Y3Q7CisgICAgUEFJTlRTVFJVQ1QJcHM7CisgICAgSERDCQloREM7CisgICAgUkVDVAlyZWN0OworICAgIExQTVNHQk9YCWxwbWI7CisgICAgTFBNU0dCT1gJbHBtYkluaXQ7CisgICAgQklUTUFQCWJtOworICAgIEhCSVRNQVAJaEJpdE1hcDsKKyAgICBIREMJCWhNZW1EQzsKKyAgICBISUNPTgloSWNvbjsKKyAgICBISU5TVEFOQ0UJaEluc3QyOworICAgIGludAkJeDsKKyAgICBzd2l0Y2gobWVzc2FnZSkgeworCWNhc2UgV01fQ1JFQVRFOgorCSAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKKwkgICAgY3JlYXRlU3RydWN0ID0gKENSRUFURVNUUlVDVCAqKWxQYXJhbTsKKyAgICAgCSAgICBscG1iSW5pdCA9IChMUE1TR0JPWCljcmVhdGVTdHJ1Y3QtPmxwQ3JlYXRlUGFyYW1zOworICAgICAJICAgIGlmIChscG1iSW5pdCA9PSAwKSBicmVhazsKKwkgICAgKigoTFBNU0dCT1ggKikmd25kUHRyLT53RXh0cmFbMV0pID0gbHBtYkluaXQ7CisJICAgIGxwbWIgPSBNc2dCb3hHZXRTdG9yYWdlSGVhZGVyKGhXbmQpOworCSAgICBHZXRDbGllbnRSZWN0KGhXbmQsICZyZWN0KTsKKwkgICAgc3dpdGNoKGxwbWItPndUeXBlICYgTUJfVFlQRU1BU0spIHsKKwkJY2FzZSBNQl9PSyA6CisJCSAgICBscG1iLT5oV25kWWVzID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiJk9rIiwgCisJCQlXU19DSElMRCB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLAorCQkJcmVjdC5yaWdodCAvIDIgLSA3MCwgcmVjdC5ib3R0b20gLSAyNSwgCisJCQk2MCwgMTgsIGhXbmQsIDEsIHduZFB0ci0+aEluc3RhbmNlLCAwTCk7CisJCSAgICBicmVhazsKKwkJY2FzZSBNQl9PS0NBTkNFTCA6CisJCSAgICBscG1iLT5oV25kWWVzID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiJk9rIiwgCisJCQlXU19DSElMRCB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLAorCQkJcmVjdC5yaWdodCAvIDIgLSA3MCwgcmVjdC5ib3R0b20gLSAyNSwgCisJCQk2MCwgMTgsIGhXbmQsIDEsIHduZFB0ci0+aEluc3RhbmNlLCAwTCk7CisJCSAgICBscG1iLT5oV25kQ2FuY2VsID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiJkNhbmNlbCIsIAorCQkJV1NfQ0hJTEQgfCBXU19DTElQQ0hJTERSRU4gfCBXU19WSVNJQkxFIHwgQlNfUFVTSEJVVFRPTiwKKwkJCXJlY3QucmlnaHQgLyAyICsgMTAsIHJlY3QuYm90dG9tIC0gMjUsIAorCQkJNjAsIDE4LCBoV25kLCAyLCB3bmRQdHItPmhJbnN0YW5jZSwgMEwpOworCQkgICAgYnJlYWs7CisJCWNhc2UgTUJfQUJPUlRSRVRSWUlHTk9SRSA6CisJCSAgICBscG1iLT5oV25kWWVzID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiJlJldHJ5IiwgCisJCQlXU19DSElMRCB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLAorCQkJcmVjdC5yaWdodCAvIDIgLSA3MCwgcmVjdC5ib3R0b20gLSAyNSwgCisJCQk2MCwgMTgsIGhXbmQsIDEsIHduZFB0ci0+aEluc3RhbmNlLCAwTCk7CisJCSAgICBscG1iLT5oV25kTm8gPSBDcmVhdGVXaW5kb3coIkJVVFRPTiIsICImSWdub3JlIiwgCisJCQlXU19DSElMRCB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLAorCQkJcmVjdC5yaWdodCAvIDIgKyAxMCwgcmVjdC5ib3R0b20gLSAyNSwgCisJCQk2MCwgMTgsIGhXbmQsIDIsIHduZFB0ci0+aEluc3RhbmNlLCAwTCk7CisJCSAgICBscG1iLT5oV25kQ2FuY2VsID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiJkFib3J0IiwgCisJCQlXU19DSElMRCB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLAorCQkJcmVjdC5yaWdodCAvIDIgKyA4MCwgcmVjdC5ib3R0b20gLSAyNSwgCisJCQk2MCwgMTgsIGhXbmQsIDMsIHduZFB0ci0+aEluc3RhbmNlLCAwTCk7CisJCSAgICBicmVhazsKKwkJY2FzZSBNQl9ZRVNOTyA6CisJCSAgICBscG1iLT5oV25kWWVzID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiJlllcyIsIAorCQkJV1NfQ0hJTEQgfCBXU19DTElQQ0hJTERSRU4gfCBXU19WSVNJQkxFIHwgQlNfUFVTSEJVVFRPTiwKKwkJCXJlY3QucmlnaHQgLyAyIC0gNzAsIHJlY3QuYm90dG9tIC0gMjUsIAorCQkJNjAsIDE4LCBoV25kLCAxLCB3bmRQdHItPmhJbnN0YW5jZSwgMEwpOworCQkgICAgbHBtYi0+aFduZE5vID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiJk5vIiwgCisJCQlXU19DSElMRCB8IFdTX0NMSVBDSElMRFJFTiB8IFdTX1ZJU0lCTEUgfCBCU19QVVNIQlVUVE9OLAorCQkJcmVjdC5yaWdodCAvIDIgKyAxMCwgcmVjdC5ib3R0b20gLSAyNSwgCisJCQk2MCwgMTgsIGhXbmQsIDIsIHduZFB0ci0+aEluc3RhbmNlLCAwTCk7CisJCSAgICBicmVhazsKKwkJfQorCSAgICBzd2l0Y2gobHBtYi0+d1R5cGUgJiBNQl9JQ09OTUFTSykgeworCQljYXNlIE1CX0lDT05FWENMQU1BVElPTjoKKwkJICAgIHByaW50ZigiTXNnQm94IExvYWRJY29uIEV4Y2xhbWF0aW9uICFcbiIpOworCQkgICAgbHBtYi0+aEljb24gPSBMb2FkSWNvbigoSElOU1RBTkNFKU5VTEwsIElESV9FWENMQU1BVElPTik7CisJCSAgICBicmVhazsKKwkJY2FzZSBNQl9JQ09OUVVFU1RJT046CisJCSAgICBwcmludGYoIk1zZ0JveCBMb2FkSWNvbiBRdWVzdGlvbiAhXG4iKTsKKwkJICAgIGxwbWItPmhJY29uID0gTG9hZEljb24oKEhJTlNUQU5DRSlOVUxMLCBJRElfUVVFU1RJT04pOworCQkgICAgYnJlYWs7CisJCWNhc2UgTUJfSUNPTkFTVEVSSVNLOgorCQkgICAgcHJpbnRmKCJNc2dCb3ggTG9hZEljb24gQXN0ZXJpc2sgIVxuIik7CisJCSAgICBscG1iLT5oSWNvbiA9IExvYWRJY29uKChISU5TVEFOQ0UpTlVMTCwgSURJX0FTVEVSSVNLKTsKKwkJICAgIGJyZWFrOworCQljYXNlIE1CX0lDT05IQU5EOgorCQkgICAgcHJpbnRmKCJNc2dCb3ggTG9hZEljb24gSGFuZCAhXG4iKTsKKwkJICAgIGxwbWItPmhJY29uID0gTG9hZEljb24oKEhJTlNUQU5DRSlOVUxMLCBJRElfSEFORCk7CisJCSAgICBicmVhazsKKwkgICAgCX0KKwkgICAgYnJlYWs7CisJY2FzZSBXTV9QQUlOVDoKKwkgICAgbHBtYiA9IE1zZ0JveEdldFN0b3JhZ2VIZWFkZXIoaFduZCk7CisJICAgIEdldENsaWVudFJlY3QoaFduZCwgJnJlY3QpOworCSAgICBoREMgPSBCZWdpblBhaW50KGhXbmQsICZwcyk7CisJICAgIGlmIChscG1iLT5oSWNvbikgRHJhd0ljb24oaERDLCAzMCwgMjAsIGxwbWItPmhJY29uKTsKKwkgICAgVGV4dE91dChoREMsIHJlY3QucmlnaHQgLyAyLCAxNSwgCisJICAgIAlscG1iLT5UaXRsZSwgc3RybGVuKGxwbWItPlRpdGxlKSk7CisJICAgIFRleHRPdXQoaERDLCByZWN0LnJpZ2h0IC8gMiwgMzAsIAorCSAgICAJbHBtYi0+U3RyLCBzdHJsZW4obHBtYi0+U3RyKSk7CisJICAgIEVuZFBhaW50KGhXbmQsICZwcyk7CisJICAgIGJyZWFrOworCWNhc2UgV01fREVTVFJPWToKKwkgICAgcHJpbnRmKCJNZXNzYWdlQm94IFdNX0RFU1RST1kgIVxuIik7CisJICAgIFJlbGVhc2VDYXB0dXJlKCk7CisJICAgIGxwbWIgPSBNc2dCb3hHZXRTdG9yYWdlSGVhZGVyKGhXbmQpOworCSAgICBscG1iLT5BY3RpdmVGbGcgPSBGQUxTRTsKKwkgICAgaWYgKGxwbWItPmhJY29uKSBEZXN0cm95SWNvbihscG1iLT5oSWNvbik7CisJICAgIGlmIChscG1iLT5oV25kWWVzKSBEZXN0cm95V2luZG93KGxwbWItPmhXbmRZZXMpOworCSAgICBpZiAobHBtYi0+aFduZE5vKSBEZXN0cm95V2luZG93KGxwbWItPmhXbmRObyk7CisJICAgIGlmIChscG1iLT5oV25kQ2FuY2VsKSBEZXN0cm95V2luZG93KGxwbWItPmhXbmRDYW5jZWwpOworCSAgICBicmVhazsKKwljYXNlIFdNX0NPTU1BTkQ6CisJICAgIGxwbWIgPSBNc2dCb3hHZXRTdG9yYWdlSGVhZGVyKGhXbmQpOworCSAgICBzd2l0Y2god1BhcmFtKSB7CisJCWNhc2UgMToKKwkJICAgIGxwbWItPndSZXRWYWwgPSBJRE9LOworCQkgICAgYnJlYWs7CisJCWNhc2UgMjoKKwkJICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOworCQkgICAgaERDID0gR2V0REMoaFduZCk7CisvKgorCQkgICAgZm9yICh4ID0gMTsgeCA8IDUwOyB4KyspIHsKKwkJCWhCaXRNYXAgPSBMb2FkQml0bWFwKHduZFB0ci0+aEluc3RhbmNlLCBNQUtFSU5UUkVTT1VSQ0UoeCkpOworCQkJR2V0T2JqZWN0KGhCaXRNYXAsIHNpemVvZihCSVRNQVApLCAoTFBTVFIpJmJtKTsKKwkJCWhNZW1EQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhoREMpOworCQkJU2VsZWN0T2JqZWN0KGhNZW1EQywgaEJpdE1hcCk7CisJCQlwcmludGYoIiBibS5ibVdpZHRoPSVkIGJtLmJtSGVpZ2h0PSVkXG4iLAorCQkJCWJtLmJtV2lkdGgsIGJtLmJtSGVpZ2h0KTsKKwkJCUJpdEJsdChoREMsIHggKiAyMCwgMzAsIGJtLmJtV2lkdGgsIGJtLmJtSGVpZ2h0LCBoTWVtREMsIDAsIDAsIFNSQ0NPUFkpOworCQkJRGVsZXRlREMoaE1lbURDKTsKKwkJCX0KKyovCisJCSAgICBoQml0TWFwID0gTG9hZEJpdG1hcCgoSElOU1RBTkNFKU5VTEwsICJTTUlMRSIpOworCQkgICAgR2V0T2JqZWN0KGhCaXRNYXAsIHNpemVvZihCSVRNQVApLCAoTFBTVFIpJmJtKTsKKwkJICAgIHByaW50ZigiYm0uYm1XaWR0aD0lZCBibS5ibUhlaWdodD0lZFxuIiwKKwkJICAgIAlibS5ibVdpZHRoLCBibS5ibUhlaWdodCk7ICAKKwkJICAgIGhNZW1EQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhoREMpOworCQkgICAgU2VsZWN0T2JqZWN0KGhNZW1EQywgaEJpdE1hcCk7CisJCSAgICBCaXRCbHQoaERDLCAxMDAsIDMwLCBibS5ibVdpZHRoLCBibS5ibUhlaWdodCwgaE1lbURDLCAwLCAwLCBTUkNDT1BZKTsKKwkJICAgIERlbGV0ZURDKGhNZW1EQyk7CisJCSAgICBSZWxlYXNlREMoaFduZCwgaERDKTsKKwkJICAgIGxwbWItPndSZXRWYWwgPSBJRENBTkNFTDsKKy8qCisJCSAgICBTZXRXaW5kb3dQb3MobHBtYi0+aFduZE5vLCAoSFdORClOVUxMLCAyMCwgMjAsIDAsIDAsIAorCQkgICAgCQlTV1BfTk9TSVpFIHwgU1dQX05PWk9SREVSKTsKKyovCisJCSAgICByZXR1cm4gMDsKKwkJICAgIGJyZWFrOworCQljYXNlIDM6CisJCSAgICBoREMgPSBHZXREQyhoV25kKTsKKwkJICAgIGhJbnN0MiA9IExvYWRJbWFnZSgiZXYzbGl0ZS5leGUiLCBOVUxMKTsKKwkJICAgIGhJY29uID0gTG9hZEljb24oaEluc3QyLCAiRVYzTElURSIpOworCQkgICAgRHJhd0ljb24oaERDLCAyMCwgMjAsIGhJY29uKTsKKwkJICAgIERlc3Ryb3lJY29uKGhJY29uKTsKKwkJICAgIGhJbnN0MiA9IExvYWRJbWFnZSgic3lzcmVzLmRsbCIsIE5VTEwpOworCQkgICAgaEljb24gPSBMb2FkSWNvbihoSW5zdDIsICJXSU5FSUNPTiIpOworCQkgICAgRHJhd0ljb24oaERDLCA2MCwgMjAsIGhJY29uKTsKKwkJICAgIERlc3Ryb3lJY29uKGhJY29uKTsKKwkJICAgIGhJY29uID0gTG9hZEljb24oKEhJTlNUQU5DRSlOVUxMLCBJRElfRVhDTEFNQVRJT04pOworCQkgICAgRHJhd0ljb24oaERDLCAxMDAwLCAyMCwgaEljb24pOworCQkgICAgRGVzdHJveUljb24oaEljb24pOworCQkgICAgUmVsZWFzZURDKGhXbmQsIGhEQyk7CisJCSAgICBscG1iLT53UmV0VmFsID0gSURJR05PUkU7CisJCSAgICByZXR1cm4oMCk7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgIHJldHVybigwKTsKKwkJfQorCSAgICBDbG9zZVdpbmRvdyhoV25kKTsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKKyAgICB9CityZXR1cm4oMCk7Cit9CisKKworCmRpZmYgLS1naXQgYS9taXNjL3h0LmMgYi9taXNjL3h0LmMKaW5kZXggOTI4ZDZkZC4uOGQzODZhZSAxMDA2NDQKLS0tIGEvbWlzYy94dC5jCisrKyBiL21pc2MveHQuYwpAQCAtNTMsMTEgKzUzLDYgQEAKICAqLwogCiAKLWludCBNZXNzYWdlQm94KCBIV05EIGh3bmQsIExQU1RSIHN0ciwgTFBTVFIgdGl0bGUsIFdPUkQgdHlwZSApCi17Ci0gICAgcHJpbnRmKCAiTWVzc2FnZUJveDogJyVzJ1xuIiwgc3RyICk7Ci19Ci0KIHZvaWQgTWVzc2FnZUJlZXAoIFdPUkQgaSApCiB7CiAgICAgWEJlbGwoWFRfZGlzcGxheSwgMTAwKTsKQEAgLTEwMiwxMiArOTcsNiBAQAogfQogCiAKLUJPT0wgSXNJY29uaWMoIEhXTkQgaHduZCApCi17Ci0gICAgcHJpbnRmKCAiSXNJY29uaWM6IHJldHVybmluZyBGQUxTRVxuIiApOwotICAgIHJldHVybiBGQUxTRTsKLX0KLQogSE1FTlUgQ3JlYXRlTWVudSgpIHsgcmV0dXJuIDA7IH0KIAogQk9PTCBBcHBlbmRNZW51KCBITUVOVSBobWVudSwgV09SRCBmbGFncywgV09SRCBpZCwgTFBTVFIgdGV4dCApIHsgcmV0dXJuIFRSVUU7fQpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9jb2xvci5jIGIvb2JqZWN0cy9jb2xvci5jCmluZGV4IDAyMTVkNDcuLjE5MDY1ZWEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvY29sb3IuYworKysgYi9vYmplY3RzL2NvbG9yLmMKQEAgLTE5LDcgKzE5LDcgQEAKICAqIFdlIHRyeSB0byB1c2UgYSBwcml2YXRlIGNvbG9yIG1hcCBpZiBwb3NzaWJsZSwgYmVjYXVzZSBXaW5kb3dzIHByb2dyYW1zCiAgKiBhc3N1bWUgdGhhdCBwYWxldHRlKDApID09IEJsYWNrIGFuZCBwYWxldHRlKG1heC0xKSA9PSBXaGl0ZS4KICAqLwotI2RlZmluZSBVU0VfUFJJVkFURV9NQVAKKyN1bmRlZiBVU0VfUFJJVkFURV9NQVAKIAogQ29sb3JtYXAgQ09MT1JfV2luQ29sb3JtYXAgPSAwOwogCmRpZmYgLS1naXQgYS9vYmplY3RzL2RpYi5jIGIvb2JqZWN0cy9kaWIuYwppbmRleCA4MzlmMGI1Li43MzVlNDQ5IDEwMDY0NAotLS0gYS9vYmplY3RzL2RpYi5jCisrKyBiL29iamVjdHMvZGliLmMKQEAgLTYsOSArNiwxMSBAQAogCiBzdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgIEFsZXhhbmRyZSBKdWxsaWFyZCwgMTk5MyI7CiAKKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCiAjaW5jbHVkZSAiZ2RpLmgiCisjaW5jbHVkZSAiaWNvbi5oIgogCiAKIGV4dGVybiBYSW1hZ2UgKiBCSVRNQVBfQm1wVG9JbWFnZSggQklUTUFQICosIHZvaWQgKiApOwpAQCAtMjAxLDMgKzIwMyw0NSBAQAogCQkJCSAgICBiaXRzLCBkYXRhLCBjb2xvcnVzZSApOwogICAgIHJldHVybiBoYW5kbGU7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERyYXdJY29uICAgIChVU0VSLjg0KQorICovCitCT09MIERyYXdJY29uKEhEQyBoREMsIHNob3J0IHgsIHNob3J0IHksIEhJQ09OIGhJY29uKQoreworICAgIElDT05BTExPQwkqbHBpY287CisgICAgQklUTUFQCWJtOworICAgIEhCSVRNQVAJaEJpdFRlbXA7CisgICAgSERDCQloTWVtREM7CisgICAgSERDCQloTWVtREMyOworI2lmZGVmIERFQlVHX0lDT04KKyAgICBwcmludGYoIkRyYXdJY29uKCUwNFgsICVkLCAlZCwgJTA0WCkgXG4iLCBoREMsIHgsIHksIGhJY29uKTsKKyNlbmRpZgorICAgIGlmIChoSWNvbiA9PSAoSElDT04pTlVMTCkgcmV0dXJuIEZBTFNFOworICAgIGxwaWNvID0gKElDT05BTExPQyAqKUdsb2JhbExvY2soaEljb24pOworICAgIEdldE9iamVjdChscGljby0+aEJpdG1hcCwgc2l6ZW9mKEJJVE1BUCksIChMUFNUUikmYm0pOworI2lmZGVmIERFQlVHX0lDT04KKyAgICBwcmludGYoIkRyYXdJY29uIC8geD0lZCB5PSVkXG4iLCB4LCB5KTsKKyAgICBwcmludGYoIkRyYXdJY29uIC8gaWNvbiBXaWR0aD0lZFxuIiwgKGludClscGljby0+ZGVzY3JpcHRvci5XaWR0aCk7CisgICAgcHJpbnRmKCJEcmF3SWNvbiAvIGljb24gSGVpZ2h0PSVkXG4iLCAoaW50KWxwaWNvLT5kZXNjcmlwdG9yLkhlaWdodCk7CisgICAgcHJpbnRmKCJEcmF3SWNvbiAvIGljb24gQ29sb3JDb3VudD0lZFxuIiwgKGludClscGljby0+ZGVzY3JpcHRvci5Db2xvckNvdW50KTsKKyAgICBwcmludGYoIkRyYXdJY29uIC8gaWNvbiBpY29ESUJTaXplPSVsWFxuIiwgKERXT1JEKWxwaWNvLT5kZXNjcmlwdG9yLmljb0RJQlNpemUpOworICAgIHByaW50ZigiRHJhd0ljb24gLyBpY29uIGljb0RJQk9mZnNldD0lbFhcbiIsIChEV09SRClscGljby0+ZGVzY3JpcHRvci5pY29ESUJPZmZzZXQpOworICAgIHByaW50ZigiRHJhd0ljb24gLyBiaXRtYXAgYm1XaWR0aD0lZCBibUhlaWdodD0lZFxuIiwgYm0uYm1XaWR0aCwgYm0uYm1IZWlnaHQpOworI2VuZGlmCisgICAgaE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGhEQyk7CisjaWZkZWYgREVCVUdfSUNPTgorICAgIFNlbGVjdE9iamVjdChoTWVtREMsIGxwaWNvLT5oQml0bWFwKTsKKyAgICBCaXRCbHQoaERDLCB4LCB5LCBibS5ibVdpZHRoLCBibS5ibUhlaWdodCwgaE1lbURDLCAwLCAwLCBTUkNDT1BZKTsKKyAgICBTZWxlY3RPYmplY3QoaE1lbURDLCBscGljby0+aEJpdE1hc2spOworICAgIEJpdEJsdChoREMsIHgsIHkgKyBibS5ibUhlaWdodCwgYm0uYm1XaWR0aCwgYm0uYm1IZWlnaHQsIGhNZW1EQywgMCwgMCwgU1JDQ09QWSk7CisjZWxzZQorICAgIFNlbGVjdE9iamVjdChoTWVtREMsIGxwaWNvLT5oQml0TWFzayk7CisgICAgQml0Qmx0KGhEQywgeCwgeSwgYm0uYm1XaWR0aCwgYm0uYm1IZWlnaHQsIGhNZW1EQywgMCwgMCwgU1JDQU5EKTsKKyAgICBTZWxlY3RPYmplY3QoaE1lbURDLCBscGljby0+aEJpdG1hcCk7CisgICAgQml0Qmx0KGhEQywgeCwgeSwgYm0uYm1XaWR0aCwgYm0uYm1IZWlnaHQsIGhNZW1EQywgMCwgMCwgU1JDUEFJTlQpOworI2VuZGlmCisgICAgRGVsZXRlREMoaE1lbURDKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvc3lzcmVzLmRsbCBiL3N5c3Jlcy5kbGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDRhNTNhYgotLS0gL2Rldi9udWxsCisrKyBiL3N5c3Jlcy5kbGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9idG5sb29rLmMgYi90ZXN0L2J0bmxvb2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjhmNTYwOC4uMDAwMDAwMAotLS0gYS90ZXN0L2J0bmxvb2suYworKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSAgIEJUTkxPT0suQyAtLSBCdXR0b24gTG9vayBQcm9ncmFtDQotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLQ0KLSNpbmNsdWRlIDx3aW5kb3dzLmg+DQotI2luY2x1ZGUgPHN0ZGlvLmg+DQotDQotc3RydWN0DQotew0KLQlsb25nICAgIHN0eWxlOw0KLQljaGFyICAgICp0ZXh0Ow0KLX0NCi1idXR0b25bXSA9DQotew0KLQlCU19QVVNIQlVUVE9OLCAgICAgICAgICAiUFVTSEJVVFRPTiIsDQotCUJTX0RFRlBVU0hCVVRUT04sICAgICAgICJERUZQVVNIQlVUVE9OIiwNCi0JQlNfQ0hFQ0tCT1gsICAgICAgICAgICAgIkNIRUNLQk9YIiwNCi0JQlNfQVVUT0NIRUNLQk9YLCAgICAgICAgIkFVVE9DSEVDS0JPWCIsDQotCUJTX1JBRElPQlVUVE9OLCAgICAgICAgICJSQURJT0JVVFRPTiIsDQotCUJTXzNTVEFURSwgICAgICAgICAgICAgICIzU1RBVEUiLA0KLQlCU19BVVRPM1NUQVRFLCAgICAgICAgICAiQVVUTzNTVEFURSIsDQotCUJTX0dST1VQQk9YLCAgICAgICAgICAgICJHUk9VUEJPWCIsDQotCUJTX1VTRVJCVVRUT04sICAgICAgICAgICJVU0VSQlVUVE9OIiwNCi0JQlNfQVVUT1JBRElPQlVUVE9OLCAgICAgIkFVVE9SQURJT0JVVFRPTiINCi19Ow0KLQ0KLSNkZWZpbmUgTlVNIChzaXplb2YgYnV0dG9uIC8gc2l6ZW9mIGJ1dHRvblswXSkNCi0NCi1sb25nIEZBUiBQQVNDQUwgX2V4cG9ydCBXbmRQcm9jKEhXTkQsIFdPUkQsIFdPUkQsIExPTkcpOw0KLQ0KLWludCBQQVNDQUwgV2luTWFpbihIQU5ETEUgaEluc3RhbmNlLCBIQU5ETEUgaFByZXZJbnN0YW5jZSwNCi0JCSAgIExQU1RSIGxwc3pDbWRQYXJhbSwgaW50IG5DbWRTaG93KQ0KLXsNCi0Jc3RhdGljIGNoYXIgc3pBcHBOYW1lW10gPSAiQnRuTG9vayI7DQotCUhXTkQgICAgICAgIGh3bmQ7DQotCU1TRyAgICAgICAgIG1zZzsNCi0JV05EQ0xBU1MgICAgd25kY2xhc3M7DQotDQotCWlmICghaFByZXZJbnN0YW5jZSkNCi0Jew0KLQkJd25kY2xhc3Muc3R5bGUgICAgICAgICAgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsNCi0JCXduZGNsYXNzLmxwZm5XbmRQcm9jICAgID0gV25kUHJvYzsNCi0JCXduZGNsYXNzLmNiQ2xzRXh0cmEgICAgID0gMDsNCi0JCXduZGNsYXNzLmNiV25kRXh0cmEgICAgID0gMDsNCi0JCXduZGNsYXNzLmhJbnN0YW5jZSAgICAgID0gaEluc3RhbmNlOw0KLQkJd25kY2xhc3MuaEljb24gICAgICAgICAgPSBMb2FkSWNvbihOVUxMLCBJRElfQVBQTElDQVRJT04pOw0KLQkJd25kY2xhc3MuaEN1cnNvciAgICAgICAgPSBMb2FkQ3Vyc29yKE5VTEwsIElEQ19BUlJPVyk7DQotCQl3bmRjbGFzcy5oYnJCYWNrZ3JvdW5kICA9IEdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIKTsNCi0JCXduZGNsYXNzLmxwc3pNZW51TmFtZSAgID0gTlVMTDsNCi0JCXduZGNsYXNzLmxwc3pDbGFzc05hbWUgID0gc3pBcHBOYW1lOw0KLQ0KLQkJUmVnaXN0ZXJDbGFzcygmd25kY2xhc3MpOw0KLQl9DQotDQotCWh3bmQgPSBDcmVhdGVXaW5kb3coc3pBcHBOYW1lLCAiQnV0dG9uIExvb2siLA0KLQkJCVdTX09WRVJMQVBQRURXSU5ET1csDQotCQkJQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwNCi0JCQlDV19VU0VERUZBVUxULCBDV19VU0VERUZBVUxULA0KLQkJCU5VTEwsIE5VTEwsIGhJbnN0YW5jZSwgTlVMTCk7DQotDQotCVNob3dXaW5kb3coaHduZCwgbkNtZFNob3cpOw0KLQlVcGRhdGVXaW5kb3coaHduZCk7DQotDQotCXdoaWxlIChHZXRNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDApKQ0KLQl7DQotCQlUcmFuc2xhdGVNZXNzYWdlKCZtc2cpOw0KLQkJRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOw0KLQl9DQotCXJldHVybiBtc2cud1BhcmFtOw0KLX0NCi0NCi1sb25nIEZBUiBQQVNDQUwgX2V4cG9ydCBXbmRQcm9jKEhXTkQgaHduZCwgV09SRCBtZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pDQotew0KLQlzdGF0aWMgY2hhciBzelBybVtdICAgID0gIndQYXJhbSAgICAgIExPV09SRChsUGFyYW0pICBISVdPUkQobFBhcmFtKSIsDQotCQkgICAgc3pUb3BbXSAgICA9ICJDb250cm9sIElEICBXaW5kb3cgSGFuZGxlICAgTm90aWZpY2F0aW9uIiwNCi0JCSAgICBzelVuZFtdICAgID0gIl9fX19fX19fX18gIF9fX19fX19fX19fX18gICBfX19fX19fX19fX18iLA0KLQkJICAgIHN6Rm9ybWF0W10gPSAiICU1dSAgICAgICAgICAlNFggICAgICAgICAgJTV1IiwNCi0JCSAgICBzekJ1ZmZlcls1MF07DQotCXN0YXRpYyBIV05EIGh3bmRCdXR0b25bTlVNXTsNCi0Jc3RhdGljIFJFQ1QgcmVjdDsNCi0Jc3RhdGljIGludCAgY3hDaGFyLCBjeUNoYXI7DQotCUhEQyAgICAgICAgIGhkYzsNCi0JUEFJTlRTVFJVQ1QgcHM7DQotCWludCAgICAgICAgIGk7DQotCVRFWFRNRVRSSUMgIHRtOw0KLQ0KLQlzd2l0Y2ggKG1lc3NhZ2UpDQotCXsNCi0JCWNhc2UgV01fQ1JFQVRFOg0KLQkJCWhkYyA9IEdldERDKGh3bmQpOw0KLQkJCVNlbGVjdE9iamVjdChoZGMsIEdldFN0b2NrT2JqZWN0KFNZU1RFTV9GSVhFRF9GT05UKSk7DQotCQkJR2V0VGV4dE1ldHJpY3MoaGRjLCAmdG0pOw0KLQkJCWN4Q2hhciA9IHRtLnRtQXZlQ2hhcldpZHRoOw0KLQkJCWN5Q2hhciA9IHRtLnRtSGVpZ2h0ICsgdG0udG1FeHRlcm5hbExlYWRpbmc7DQotCQkJUmVsZWFzZURDKGh3bmQsIGhkYyk7DQotDQotCQkJZm9yIChpID0gMDsgaSA8IE5VTTsgaSsrKQ0KLQkJCQlod25kQnV0dG9uW2ldID0gQ3JlYXRlV2luZG93KCJidXR0b24iLCBidXR0b25baV0udGV4dCwNCi0JCQkJCSAgIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IGJ1dHRvbltpXS5zdHlsZSwNCi0JCQkJCSAgIGN4Q2hhciwgY3lDaGFyICogKDEgKyAyICogaSksDQotCQkJCQkgICAyMCAqIGN4Q2hhciwgNyAqIGN5Q2hhciAvIDQsDQotCQkJCQkgICBod25kLCBpLA0KLQkJCQkJICAgKChMUENSRUFURVNUUlVDVCkgbFBhcmFtKS0+aEluc3RhbmNlLCBOVUxMKTsNCi0JCQlyZXR1cm4gMDsNCi0NCi0JCWNhc2UgV01fU0laRToNCi0JCQlyZWN0LmxlZnQgICA9IDI0ICogY3hDaGFyOw0KLQkJCXJlY3QudG9wICAgID0gIDMgKiBjeUNoYXI7DQotCQkJcmVjdC5yaWdodCAgPSBMT1dPUkQobFBhcmFtKTsNCi0JCQlyZWN0LmJvdHRvbSA9IEhJV09SRChsUGFyYW0pOw0KLQkJCXJldHVybiAwOw0KLQ0KLQkJY2FzZSBXTV9QQUlOVDoNCi0JCQlJbnZhbGlkYXRlUmVjdChod25kLCAmcmVjdCwgVFJVRSk7DQotDQotCQkJaGRjID0gQmVnaW5QYWludChod25kLCAmcHMpOw0KLQkJCVNlbGVjdE9iamVjdChoZGMsIEdldFN0b2NrT2JqZWN0KFNZU1RFTV9GSVhFRF9GT05UKSk7DQotCQkJU2V0QmtNb2RlKGhkYywgVFJBTlNQQVJFTlQpOw0KLQkJCVRleHRPdXQoaGRjLCAyNCAqIGN4Q2hhciwgMSAqIGN5Q2hhciwgc3pQcm0sIHNpemVvZiBzelBybSAtIDEpOw0KLQkJCVRleHRPdXQoaGRjLCAyNCAqIGN4Q2hhciwgMiAqIGN5Q2hhciwgc3pUb3AsIHNpemVvZiBzelRvcCAtIDEpOw0KLQkJCVRleHRPdXQoaGRjLCAyNCAqIGN4Q2hhciwgMiAqIGN5Q2hhciwgc3pVbmQsIHNpemVvZiBzelVuZCAtIDEpOw0KLQ0KLQkJCUVuZFBhaW50KGh3bmQsICZwcyk7DQotCQkJcmV0dXJuIDA7DQotDQotCQljYXNlIFdNX0NPTU1BTkQ6DQotLyoJCQlTY3JvbGxXaW5kb3coaHduZCwgMCwgLWN5Q2hhciwgJnJlY3QsICZyZWN0KTsgICovDQotCQkJaGRjID0gR2V0REMoaHduZCk7DQotCQkJU2VsZWN0T2JqZWN0KGhkYywgR2V0U3RvY2tPYmplY3QoU1lTVEVNX0ZJWEVEX0ZPTlQpKTsNCi0NCi0JCQlUZXh0T3V0KGhkYywgMjQgKiBjeENoYXIsIGN5Q2hhciAqIDUsICAvKiAocmVjdC5ib3R0b20gLyBjeUNoYXIgLSAxKSwgKi8NCi0JCQkJc3pCdWZmZXIsIHNwcmludGYoc3pCdWZmZXIsIHN6Rm9ybWF0LCB3UGFyYW0sDQotCQkJCUxPV09SRChsUGFyYW0pLCBISVdPUkQobFBhcmFtKSkpOw0KLQ0KLQkJCVJlbGVhc2VEQyhod25kLCBoZGMpOw0KLQkJCVZhbGlkYXRlUmVjdChod25kLCBOVUxMKTsNCi0JCQlyZXR1cm4gMDsNCi0NCi0JCWNhc2UgV01fREVTVFJPWToNCi0JCQlQb3N0UXVpdE1lc3NhZ2UoMCk7DQotCQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOw0KLX0NCi0NCmRpZmYgLS1naXQgYS90ZXN0L2J0bmxvb2suZXhlIGIvdGVzdC9idG5sb29rLmV4ZQppbmRleCAxMzRjOGExLi5kOTUyYjYxIDEwMDc1NQotLS0gYS90ZXN0L2J0bmxvb2suZXhlCisrKyBiL3Rlc3QvYnRubG9vay5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LmMgYi90ZXN0L21hcnRpbl9zaGlwMi93aWRnZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU3ZTI5YS4uMDAwMDAwMAotLS0gYS90ZXN0L21hcnRpbl9zaGlwMi93aWRnZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTkxIGJ5IFRSRyBFTEVDVFJPTklLICAgICAgICAgICAgICAgICAqDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQuQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICogICAgICAgICAgICAgIHdpZGdldCBJbnZlbnRvcnkgQ29udHJvbGVyICAgUEFSVCAjIDEgICAgICAgICAgICAgICAgKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2luY2x1ZGUgPFdJTkRPV1MuSD4NCi0jaW5jbHVkZSAiU1RESU8uaCINCi0jaW5jbHVkZSAiU1RETElCLmgiDQotI2luY2x1ZGUgIlNUREFSRy5oIg0KLSNpbmNsdWRlICJTVFJJTkcuSCINCi0NCi0jaW5jbHVkZSAid2lkZ2V0LkgiDQotI2luY2x1ZGUgIndpZGdldC5WQVIiDQotI2luY2x1ZGUgIndpZGdldC5QIg0KLQ0KLSNkZWZpbmUgTm9SRUYoYSkgYT1hDQotDQotV09SRCAgICAgICAgICB3UGxheURpc2tJRDsNCi0NCi1IV05ECQloV25kQnV0Ow0KLUhXTkQJCWhXbmRDaGs7DQotSFdORAkJaFduZFJhZGlvOw0KLUhXTkQJCWhXbmRMQm94Ow0KLUhXTkQJCWhXbmRTY3JvbDsNCi1IV05ECQloV25kU2NybzI7DQotSFdORAkJaFduZFN0YXQ7DQotSFdORAkJaFduZEVkaXQ7DQotSFdORAkJaFduZENCb3g7DQotaW50CQl4LCB5Ow0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLQ0KLWludCBQQVNDQUwgV2luTWFpbihIQU5ETEUgaEluc3RhbmNlLEhBTkRMRSBoUHJldkluc3RhbmNlLA0KLSAgICAgICAgICAgICAgICAgICBMUFNUUiBscHN6Q21kTGluZSxpbnQgbkNtZFNob3cpDQotew0KLVdORENMQVNTICB3bmRDbGFzczsNCi1NU0cgICAgICAgbXNnOw0KLUhXTkQgICAgICBoV25kOw0KLUhEQyAgICAgICBoREM7DQotY2hhciAgICAgIENbNDBdOw0KLWludCAgICAgICBYOw0KLU5vUkVGKGxwc3pDbWRMaW5lKTsNCi1pZiAoICFoUHJldkluc3RhbmNlICkNCi0gICAgew0KLSAgICB3bmRDbGFzcy5zdHlsZSAgICAgICAgICAgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVyA7DQotICAgIHduZENsYXNzLmxwZm5XbmRQcm9jICAgICA9IChXTkRQUk9DKVduZFByb2M7DQotICAgIHduZENsYXNzLmNiQ2xzRXh0cmEgICAgICA9IDA7DQotICAgIHduZENsYXNzLmNiV25kRXh0cmEgICAgICA9IDA7DQotICAgIHduZENsYXNzLmhJbnN0YW5jZSAgICAgICA9IGhJbnN0YW5jZTsNCi0gICAgd25kQ2xhc3MuaEljb24gICAgICAgICAgID0gTG9hZEljb24oaEluc3RhbmNlLChMUFNUUikiSUNPTl8xIik7DQotICAgIHduZENsYXNzLmhDdXJzb3IgICAgICAgICA9IExvYWRDdXJzb3IoTlVMTCwgSURDX0FSUk9XICk7DQotICAgIHduZENsYXNzLmhickJhY2tncm91bmQgICA9IEdldFN0b2NrT2JqZWN0KFdISVRFX0JSVVNIICk7DQotICAgIHduZENsYXNzLmxwc3pNZW51TmFtZSAgICA9IHN6QXBwTmFtZTsNCi0gICAgd25kQ2xhc3MubHBzekNsYXNzTmFtZSAgID0gc3pBcHBOYW1lOw0KLSAgICBpZiAoIVJlZ2lzdGVyQ2xhc3MoJnduZENsYXNzKSkNCi0gICAgICAgIHJldHVybiBGQUxTRTsNCi0gICAgfQ0KLWhXbmQgPSBDcmVhdGVXaW5kb3coc3pBcHBOYW1lLCAid2lkZ2V0IHRlc3QgcHJvZ3JhbSIsDQotICAgICAgICAgICAgICAgICAgICBXU19QT1BVUCB8IFdTX0JPUkRFUiB8IFdTX1ZJU0lCTEUsIDUwLCA1MCwNCi0gICAgICAgICAgICAgICAgICAgIDQwMCwgNDAwLCBOVUxMLCBOVUxMLCBoSW5zdGFuY2UsIE5VTEwpOw0KLWhXbmRNYWluID0gaFduZDsNCi1oSW5zdCA9IGhJbnN0YW5jZTsNCi1oRENNYWluID0gR2V0REMoaFduZE1haW4pOw0KLQ0KLUluaXRXaWRnZXRzKCk7DQotDQotd2hpbGUgKEdldE1lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCkpDQotICAgIHsNCi0gICAgVHJhbnNsYXRlTWVzc2FnZSgmbXNnICk7DQotICAgIERpc3BhdGNoTWVzc2FnZSgmbXNnICk7DQotICAgIH0NCi1SZWxlYXNlREMoaFduZE1haW4sIGhEQyk7DQotcmV0dXJuKDApOw0KLX0NCi0NCi0NCi12b2lkIEluaXRXaWRnZXRzKCkNCi17DQotaFduZEJ1dCA9IENyZWF0ZVdpbmRvdygiQlVUVE9OIiwgIkJ1dHRvbiAjMSIsDQotICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgQlNfUFVTSEJVVFRPTiwgDQotICAgICAgICAgICAgMjMwLCA0MCwgODAsIDMwLCBoV25kTWFpbiwgMTAwMSwgaEluc3QsIE5VTEwpOw0KLWhXbmRTY3JvbCA9IENyZWF0ZVdpbmRvdygiU0NST0xMQkFSIiwgIlNjcm9sbCAjMSIsDQotICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgU0JTX1ZFUlQsDQotCQkJCTIwMCwgMTQwLCAxNSwgMTAwLCBoV25kTWFpbiwgMTAwNCwgaEluc3QsIE5VTEwpOw0KLWhXbmRTY3JvMiA9IENyZWF0ZVdpbmRvdygiU0NST0xMQkFSIiwgIlNjcm9sbCAjMiIsDQotICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgU0JTX0hPUlosDQotCQkJCTUwLCAxNDAsIDEwMCwgMTUsIGhXbmRNYWluLCAxMDA1LCBoSW5zdCwgTlVMTCk7DQoteCA9IHkgPSAyNTsNCi1TZXRWZXJ0U2Nyb2xsKE5VTEwsIGhXbmRTY3JvbCwgMjUsIDAsIDUwKTsNCi1TZXRTY3JvbGxSYW5nZShoV25kU2NybzIsIFNCX0NUTCwgMCwgNTAsIFRSVUUpOw0KLVNldFNjcm9sbFBvcyhoV25kU2NybzIsIFNCX0NUTCwgMjUsIFRSVUUpOw0KLWhXbmRMQm94ID0gQ3JlYXRlV2luZG93KCJMSVNUQk9YIiwgIiIsDQotICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IExCU19OT1RJRlksDQotCQkJCTIzMCwgMTYwLCAxNTAsIDEwMCwgaFduZE1haW4sIDEwMDQsIGhJbnN0LCBOVUxMKTsNCi1TZW5kTWVzc2FnZShoV25kTEJveCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJMaXN0Qm94IGl0ZW0gIzEiKTsNCi19DQotDQotDQotDQotbG9uZyBGQVIgUEFTQ0FMIFduZFByb2MoSFdORCBoV25kLCB1bnNpZ25lZCBNZXNzYWdlLCBXT1JEIHdQYXJhbSwgTE9ORyBsUGFyYW0pDQotew0KLWludAlTaGlmdFN0YXRlOw0KLWNoYXIJQ1s4MF07DQotU2hpZnRTdGF0ZSA9IEdldEtleVN0YXRlKFZLX1NISUZUKTsNCi1zd2l0Y2goTWVzc2FnZSkNCi0gICAgew0KLSAgICBjYXNlIFdNX0NPTU1BTkQ6DQotCQkgIGlmIChMT1dPUkQobFBhcmFtKSAhPSAwKQ0KLQkJCSAgIHsNCi0JCSAgCQlzcHJpbnRmKEMsICJNQUlOIFdNX0NPTU1BTkQgd1BhcmFtPSVYIGxQYXJhbT0lbFggISEhIiwgd1BhcmFtLCBsUGFyYW0pOw0KLQkJICAJCVRleHRPdXQoaERDTWFpbiwgMjUsIDI4MCwgQywgc3RybGVuKEMpKTsNCi0JCQkgICB9DQotICAgICAgICBicmVhazsNCi0NCi0gICAgY2FzZSBXTV9LRVlET1dOOg0KLQkJICBzcHJpbnRmKEMsICJXTV9LRVlET1dOICEhISIpOw0KLQkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCA0MCwgQywgc3RybGVuKEMpKTsNCi0JCSAgS2V5RG93bihoV25kLCBNZXNzYWdlLCB3UGFyYW0pOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgIGNhc2UgV01fQ0hBUjoNCi0JCSAgc3ByaW50ZihDLCAiV01fQ0hBUiAhISEiKTsNCi0JCSAgVGV4dE91dChoRENNYWluLCAyNSwgNTAsIEMsIHN0cmxlbihDKSk7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgY2FzZSBXTV9MQlVUVE9ORE9XTjoNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIFdNX0xCVVRUT05VUDoNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIFdNX1JCVVRUT05ET1dOOg0KLSAgICAgICAgYnJlYWs7DQotDQotICAgIGNhc2UgV01fUkJVVFRPTlVQOg0KLSAgICAgICAgYnJlYWs7DQotDQotICAgIGNhc2UgV01fTU9VU0VNT1ZFOg0KLSAgICAgICAgYnJlYWs7DQotDQotICAgIGNhc2UgV01fVlNDUk9MTDoNCi0JCSAgc3ByaW50ZihDLCAiV01fVlNDUk9MTCAlWCAlWCAlbFggISEhIiwgTWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOw0KLQkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCAzNzAsIEMsIHN0cmxlbihDKSk7DQotCQkgIERvX0RsZ19WZXJ0U2Nyb2xsKGhXbmQsIHdQYXJhbSwgbFBhcmFtLCAmeSwgMCwgNTApOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgIGNhc2UgV01fSFNDUk9MTDoNCi0JCSAgc3ByaW50ZihDLCAiV01fSFNDUk9MTCAlWCAlWCAlbFggISEhIiwgTWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOw0KLQkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCAzNzAsIEMsIHN0cmxlbihDKSk7DQotCQkgIERvX0RsZ19Ib3J6U2Nyb2xsKGhXbmQsIHdQYXJhbSwgbFBhcmFtLCAmeCwgMCwgNTApOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgIGNhc2UgV01fUEFJTlQ6DQotICAgICAgICBEb1BhaW50KGhXbmQpOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgIGNhc2UgV01fREVTVFJPWToNCi0gICAgICAgIFBvc3RRdWl0TWVzc2FnZSgwKTsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBkZWZhdWx0Og0KLSAgICAgICAgcmV0dXJuIERlZldpbmRvd1Byb2MoaFduZCwgTWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOw0KLSAgICB9DQotcmV0dXJuKDApOw0KLX0NCi0NCi0NCi0NCi1CT09MIEtleURvd24oSFdORCBoV25kLCB1bnNpZ25lZCBNZXNzYWdlLCBXT1JEIHdQYXJhbSkNCi17DQotV09SRAkJCXdSZXQ7DQotVUlOVAkJCXVSZXQ7DQotRFdPUkQJCQlkd1JldDsNCi1jaGFyCQkJQ1sxMjhdOw0KLWNoYXIJCQlDMls2NF07DQotTm9SRUYoaFduZCk7DQotTm9SRUYoTWVzc2FnZSk7DQotc3ByaW50ZihDLCAiS2V5RG93biAleCAhISEiLCB3UGFyYW0pOw0KLVRleHRPdXQoaERDTWFpbiwgMjUsIDEwMCwgQywgc3RybGVuKEMpKTsNCi1zd2l0Y2ggKHdQYXJhbSkNCi0gICAgew0KLSAgICBjYXNlIFZLX0hPTUU6ICAgICAgICAgICAgLyogJ0hPTUUnIEtFWSAgICAgICAgICovDQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSBWS19MRUZUOiAgICAgICAgICAgIC8qICdMRUZUJyBDVVJTT1IgS0VZICAqLw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgVktfUklHSFQ6ICAgICAgICAgICAvKiAnUklHSFQnIENVUlNPUiBLRVkgKi8NCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFZLX1VQOiAgICAgICAgICAgICAgLyogJ1VQJyBDVVJTT1IgS0VZICAgICovDQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSBWS19ET1dOOiAgICAgICAgICAgIC8qICdET1dOJyBDVVJTT1IgS0VZICAqLw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgVktfUFJJT1I6ICAgICAgICAgICAvKiAnUEdVUCcgQ1VSU09SIEtFWSAgKi8NCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFZLX05FWFQ6ICAgICAgICAgICAgLyogJ1BHRE4nIENVUlNPUiBLRVkgICovDQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnMSc6DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnMic6DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnMyc6DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnNCc6DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnNSc6DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnQSc6DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnQic6DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnQyc6DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnRCc6DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnRSc6DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnRic6DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnRyc6DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnSCc6DQotCQkgIFdpbkhlbHAoaFduZE1haW4sICJ0b3RvLmhscCIsIEhFTFBfSU5ERVgsIDBMKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICdKJzoNCi0JCSAgV2luRXhlYygiL0Q6L3dpbmUvd2lkZ2V0LmV4ZSBhcmcxIGFyZzIgYXJnMyBhcmc0IGFyZzUgYXJnNiIsIFNXX05PUk1BTCk7DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnSyc6DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnUSc6DQotCQkgIGhXbmRTdGF0ID0gQ3JlYXRlV2luZG93KCJTVEFUSUMiLCAiU3RhdGljICMxIiwNCi0gICAgICAgICAgICAJCQlXU19DSElMRCB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX1ZJU0lCTEUgfCBTU19TSU1QTEUsIA0KLSAgICAgICAgICAgIAkJCTIzMCwgMjAsIDgwLCAyMCwgaFduZE1haW4sIDEwMDAsIGhJbnN0LCBOVUxMKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICdXJzoNCi0JCSAgaFduZENoayA9IENyZWF0ZVdpbmRvdygiQlVUVE9OIiwgIkNoZWNrQm94ICMxIiwNCi0gICAgICAgICAgICAgICAgICAgIFdTX0NISUxEIHwgV1NfQ0xJUFNJQkxJTkdTIHwgV1NfVklTSUJMRSB8IEJTX0NIRUNLQk9YLA0KLQkJCQkJCSAgMjMwLCA5MCwgMTIwLCAyMCwgaFduZE1haW4sIDEwMDIsIGhJbnN0LCBOVUxMKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICdSJzoNCi0JCSAgaFduZFJhZGlvID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiUmFkaW9CdXQgIzEiLA0KLSAgICAgICAgICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgQlNfUkFESU9CVVRUT04sDQotCQkJCQkJICAyMzAsIDEyMCwgMTIwLCAyMCwgaFduZE1haW4sIDEwMDMsIGhJbnN0LCBOVUxMKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZFJhZGlvLCBCTV9TRVRDSEVDSywgMCwgMEwpOw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgJ1QnOg0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJMaXN0Qm94IFNpbmdsZSBpdGVtIik7DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnWSc6DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkxpc3RCb3ggaXRlbSAjMiIpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJMaXN0Qm94IGl0ZW0gIzMiKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiTGlzdEJveCBpdGVtICM0Iik7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkxpc3RCb3ggaXRlbSAjNSIpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJMaXN0Qm94IGl0ZW0gIzYiKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX1NFVENVUlNFTCwgMywgMEwpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfSU5TRVJUU1RSSU5HLCA1LCAoTFBBUkFNKSJJdGVtIGJldHdlZW4gNSAmIDYiKTsNCi0JCSAgd1JldCA9IFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9GSU5EU1RSSU5HLCAtMSwgKExQQVJBTSkiSXRlbSBiZXR3ZWVuIDUgJiA2Iik7DQotCQkgIHNwcmludGYoQywgIkxCX0ZJTkRTVFJJTkcgcmV0dXJuZWQgIyV1ICAgIiwgd1JldCk7DQotCQkgIFRleHRPdXQoaERDTWFpbiwgMjUsIDMwMCwgQywgc3RybGVuKEMpKTsNCi0JCSAgd1JldCA9IFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9HRVRDVVJTRUwsIDAsIDBMKTsNCi0JCSAgc3ByaW50ZihDLCAiTEJfR0VUQ1VSU0VMIHJldHVybmVkICMldSAgICIsIHdSZXQpOw0KLQkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCAzMjAsIEMsIHN0cmxlbihDKSk7DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnVSc6DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9ERUxFVEVTVFJJTkcsIDMsIDBMKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICdJJzoNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX1JFU0VUQ09OVEVOVCwgMCwgMEwpOw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgJ08nOg0KLQkJICBDMlswXSA9ICdcMCc7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9HRVRURVhULCAyLCAoRFdPUkQpQzIpOw0KLQkJICBzcHJpbnRmKEMsICJMQl9HRVRURVhUIHJldHVybmVkICclcycgICAiLCBDMik7DQotCQkgIFRleHRPdXQoaERDTWFpbiwgMjUsIDMyMCwgQywgc3RybGVuKEMpKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICdQJzoNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0RJUiwgMCwgKERXT1JEKSIqLioiKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICdaJzoNCi0JCSAgU2hvd1dpbmRvdyhoV25kU2Nyb2wsIFNXX0hJREUpOw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgJ1gnOg0KLQkJICBTaG93V2luZG93KGhXbmRTY3JvbCwgU1dfU0hPVyk7DQotICAgICAgICBicmVhazsNCi0gICAgIGNhc2UgJ1YnOg0KLQkJICBoV25kQ0JveCA9IENyZWF0ZVdpbmRvdygiQ09NQk9CT1giLCAiQ29tYm8gIzEiLA0KLSAgICAgICAgICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfQk9SREVSIHwgQ0JTX0RST1BET1dOTElTVCwNCi0JCQkJCQkgIDIzMCwgMjcwLCAxNTAsIDEwMCwgaFduZE1haW4sIDEwMDYsIGhJbnN0LCBOVUxMKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZENCb3gsIENCX0FERFNUUklORywgMCwgKExQQVJBTSkiQ29tYm9Cb3ggaXRlbSAjMSIpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kQ0JveCwgQ0JfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJDb21ib0JveCBpdGVtICMyIik7DQotICAgICAgICBicmVhazsNCi0gICAgIGNhc2UgJ04nOg0KLQkJICBoV25kQ0JveCA9IENyZWF0ZVdpbmRvdygiQ09NQk9CT1giLCAiQ29tYm8gIzIiLA0KLSAgICAgICAgICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfQk9SREVSIHwgQ0JTX0RST1BET1dOLA0KLQkJCQkJCSAgMzAsIDI3MCwgMTUwLCAxMDAsIGhXbmRNYWluLCAxMDA3LCBoSW5zdCwgTlVMTCk7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRDQm94LCBDQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkNvbWJvQm94IGl0ZW0gIzEiKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZENCb3gsIENCX0FERFNUUklORywgMCwgKExQQVJBTSkiQ29tYm9Cb3ggaXRlbSAjMiIpOw0KLSAgICAgICAgYnJlYWs7DQotDQotICAgIGNhc2UgVktfRjEwOiAgICAgICAgICAgICAvKiAnRjEwJyBGVU5DVElPTiBLRVkgKi8NCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFZLX0YxMTogICAgICAgICAgICAgLyogJ0YxMScgRlVOQ1RJT04gS0VZICovDQotICAgICAgICBicmVhazsNCi0gICAgfQ0KLXJldHVybihUUlVFKTsNCi19DQotDQotDQotDQotdm9pZCBEb1BhaW50KEhXTkQgaFduZCkNCi17DQotSERDICAgICAgICAgaERDOw0KLVJFQ1QgICAgICAgIHJlY3Q7DQotUEFJTlRTVFJVQ1QgcHM7DQotY2hhciAgIENbODBdOw0KLUdldENsaWVudFJlY3QoaFduZCwgJnJlY3QpOw0KLWhEQyA9IEJlZ2luUGFpbnQoaFduZCwgJnBzKTsNCi1GaWxsUmVjdChoREMsICZyZWN0LCBHZXRTdG9ja09iamVjdChHUkFZX0JSVVNIKSk7DQotSW5mbGF0ZVJlY3QoJnJlY3QsIC0zLCAtMyk7DQotRnJhbWVSZWN0KGhEQywgJnJlY3QsIEdldFN0b2NrT2JqZWN0KEJMQUNLX0JSVVNIKSk7DQotSW5mbGF0ZVJlY3QoJnJlY3QsIC0xMCwgLTEwKTsNCi1GaWxsUmVjdChoREMsICZyZWN0LCBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCkpOw0KLXNwcmludGYoQywgIldpbmUgVGVzdGluZyAhISEiKTsNCi1UZXh0T3V0KGhEQywgMjUsIDI1LCBDLCBzdHJsZW4oQykpOw0KLVJlbGVhc2VEQyhoV25kLGhEQyk7DQotRW5kUGFpbnQoaFduZCwmcHMpOw0KLX0NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0NCi12b2lkIFNldFZlcnRTY3JvbGwoaW50IGhEbGcsIGludCBoV25kU0NST0xMLCBpbnQgVkFMLCBpbnQgTUlOLCBpbnQgTUFYKQ0KLXsNCi1jaGFyICBDWzEyXTsNCi1TZXRTY3JvbGxSYW5nZShoV25kU0NST0xMLCBTQl9DVEwsIC1NQVgsIC1NSU4sIEZBTFNFKTsNCi1TZXRTY3JvbGxQb3MoaFduZFNDUk9MTCwgU0JfQ1RMLCAtVkFMLCBUUlVFKTsNCi1pdG9hKFZBTCwgQywgMTApOw0KLS8vU2V0RGxnSXRlbVRleHQoaERsZywgKElERFRYVDEgKyBHZXREbGdDdHJsSUQoaFduZFNDUk9MTCkgLSBJRERTQ1JPTEwxKSwgQyk7DQotfQ0KLQ0KLQ0KLQ0KLXZvaWQgU2V0SG9yelNjcm9sbChpbnQgaERsZywgaW50IGhXbmRTQ1JPTEwsIGludCBWQUwsIGludCBNSU4sIGludCBNQVgpDQotew0KLWNoYXIgIENbMTJdOw0KLVNldFNjcm9sbFJhbmdlKGhXbmRTQ1JPTEwsIFNCX0NUTCwgTUFYLCBNSU4sIEZBTFNFKTsNCi1TZXRTY3JvbGxQb3MoaFduZFNDUk9MTCwgU0JfQ1RMLCBWQUwsIFRSVUUpOw0KLWl0b2EoVkFMLCBDLCAxMCk7DQotLy9TZXREbGdJdGVtVGV4dChoRGxnLCAoSUREVFhUMSArIEdldERsZ0N0cmxJRChoV25kU0NST0xMKSAtIElERFNDUk9MTDEpLCBDKTsNCi19DQotDQotDQotDQotdm9pZCBEb19EbGdfVmVydFNjcm9sbChIV05EIGhEbGcsIFdPUkQgd1BhcmFtLCBEV09SRCBsUGFyYW0sIGludCAqViwgaW50IE1JTiwgaW50IE1BWCkNCi17DQotY2hhciAgQ1sxMl07DQotaW50ICAgVkFMOw0KLWludCAgIFZBTDI7DQotaW50CVN0ZXAgPSAxMDA7DQotaWYgKE1BWCA8IDEwMDApCVN0ZXAgPSAxMDsNCi1pZiAoTUFYIDwgMTAwKQkJU3RlcCA9IE1BWCAvIDEwOw0KLVZBTCA9ICooVik7DQotVkFMMiA9IFZBTDsNCi1zd2l0Y2ggKHdQYXJhbSkNCi0gICAgew0KLSAgICBjYXNlIFNCX0xJTkVVUDoNCi0JCQlWQUwrKzsNCi0JCQlicmVhazsNCi0gICAgY2FzZSBTQl9MSU5FRE9XTjoNCi0JCQlWQUwtLTsNCi0JCQlicmVhazsNCi0gICAgY2FzZSBTQl9QQUdFVVA6DQotCQkJVkFMICs9IFN0ZXA7DQotCQkJYnJlYWs7DQotICAgIGNhc2UgU0JfUEFHRURPV046DQotCQkJVkFMIC09IFN0ZXA7DQotCQkJYnJlYWs7DQotICAgIGNhc2UgU0JfVEhVTUJUUkFDSzoNCi0gICAgY2FzZSBTQl9USFVNQlBPU0lUSU9OOg0KLQkJICAgVkFMID0gLShMT1dPUkQobFBhcmFtKSk7DQotCQkJYnJlYWs7DQotCX0NCi1pZiAoVkFMID4gTUFYKQkJVkFMID0gTUFYOw0KLWlmIChWQUwgPCBNSU4pCQlWQUwgPSBNSU47DQotaWYgKFZBTCAhPSBWQUwyKQ0KLSAgICB7DQotICAgIFNldFNjcm9sbFBvcyhISVdPUkQobFBhcmFtKSwgU0JfQ1RMLCAtVkFMLCBUUlVFKTsNCi0gICAgbHRvYShWQUwsIEMsIDEwKTsNCi0vLyAgICBTZXREbGdJdGVtVGV4dChoRGxnLCAoSUREVFhUMSArIEdldERsZ0N0cmxJRChISVdPUkQobFBhcmFtKSkgLSBJRERTQ1JPTEwxKSwgQyk7DQotICAgIH0NCi0qKFYpID0gVkFMOw0KLX0NCi0NCi0NCi12b2lkIERvX0RsZ19Ib3J6U2Nyb2xsKEhXTkQgaERsZywgV09SRCB3UGFyYW0sIERXT1JEIGxQYXJhbSwgaW50ICpWLCBpbnQgTUlOLCBpbnQgTUFYKQ0KLXsNCi1jaGFyICBDWzEyXTsNCi1pbnQgICBWQUw7DQotaW50ICAgVkFMMjsNCi1pbnQJU3RlcCA9IDEwMDsNCi1pZiAoTUFYIDwgMTAwMCkJU3RlcCA9IDEwOw0KLWlmIChNQVggPCAxMDApCQlTdGVwID0gTUFYIC8gMTA7DQotVkFMID0gKihWKTsNCi1WQUwyID0gVkFMOw0KLXN3aXRjaCAod1BhcmFtKQ0KLSAgICB7DQotICAgIGNhc2UgU0JfTElORVVQOg0KLQkJCVZBTC0tOw0KLQkJCWJyZWFrOw0KLSAgICBjYXNlIFNCX0xJTkVET1dOOg0KLQkJCVZBTCsrOw0KLQkJCWJyZWFrOw0KLSAgICBjYXNlIFNCX1BBR0VVUDoNCi0JCQlWQUwgLT0gU3RlcDsNCi0JCQlicmVhazsNCi0gICAgY2FzZSBTQl9QQUdFRE9XTjoNCi0JCQlWQUwgKz0gU3RlcDsNCi0JCQlicmVhazsNCi0gICAgY2FzZSBTQl9USFVNQlRSQUNLOg0KLSAgICBjYXNlIFNCX1RIVU1CUE9TSVRJT046DQotCQkgICBWQUwgPSAoTE9XT1JEKGxQYXJhbSkpOw0KLQkJCWJyZWFrOw0KLQl9DQotaWYgKFZBTCA+IE1BWCkJCVZBTCA9IE1BWDsNCi1pZiAoVkFMIDwgTUlOKQkJVkFMID0gTUlOOw0KLWlmIChWQUwgIT0gVkFMMikNCi0gICAgew0KLSAgICBTZXRTY3JvbGxQb3MoSElXT1JEKGxQYXJhbSksIFNCX0NUTCwgVkFMLCBUUlVFKTsNCi0gICAgbHRvYShWQUwsIEMsIDEwKTsNCi0vLyAgICBTZXREbGdJdGVtVGV4dChoRGxnLCAoSUREVFhUMSArIEdldERsZ0N0cmxJRChISVdPUkQobFBhcmFtKSkgLSBJRERTQ1JPTEwxKSwgQyk7DQotICAgIH0NCi0qKFYpID0gVkFMOw0KLX0NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0NCi0aClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LmRlZiBiL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5kZWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDlhNTI5NmIuLjAwMDAwMDAKLS0tIGEvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LmRlZgorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotOyogICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTEgYnkgVFJHIEVMRUNUUk9OSUsgICAgICAgICAgICAgICAgICoNCi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLQ0KLQ0KLU5BTUUgICAgICAgICBXaW5lVGVzdA0KLURFU0NSSVBUSU9OICAnRHJpbmsgSW52ZW50cnkgQ29udHJvbGVyJw0KLVNUVUIgICAgICAgICAnV0lOU1RVQi5FWEUnDQotQ09ERSAgICAgICAgIFBSRUxPQUQgTU9WRUFCTEUgRElTQ0FSREFCTEUNCi1EQVRBICAgICAgICAgUFJFTE9BRCBNT1ZFQUJMRSBNVUxUSVBMRQ0KLUVYRVRZUEUgICAgICBXSU5ET1dTDQotU0VHTUVOVFMNCi0gICAgICAgRFJJTktfVEVYVCAgUFJFTE9BRCBNT1ZFQUJMRSBESVNDQVJEQUJMRQ0KLQ0KLUhFQVBTSVpFICAgICAyMDAwMA0KLVNUQUNLU0laRSAgICA4MTkyDQotDQotRVhQT1JUUyAgICAgIFduZFByb2MgICAgICAgICAgICAgQDENCi0gICAgICAgICAgICAgQWJvdXRfUHJvYyAgICAgICAgICBAMw0KLQ0KLQ0KLQ0KLRoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L21hcnRpbl9zaGlwMi93aWRnZXQuaCBiL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMGQ5ZjAxLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5MSBieSBUUkcgRUxFQ1RST05JSyAgICAgICAgICAgICAgICAgKg0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2RlZmluZSBzekFwcE5hbWUgIndpZGdldENsYXNzIg0KLQ0KLSNkZWZpbmUgSUROVUxMICAgICAgICAgLTENCi0NCi0jZGVmaW5lIElEU0NMT1NFICAgICAgIDIwDQotI2RlZmluZSBJRFNPS0NMT1NFICAgICAyMQ0KLSNkZWZpbmUgSURTU0FWRSAgICAgICAgMjINCi0jZGVmaW5lIElEU09LU0FWRSAgICAgIDIzDQotI2RlZmluZSBJRElORk8gICAgICAgICAyNA0KLSNkZWZpbmUgSURTQVZFICAgICAgICAgMjUNCi0jZGVmaW5lIElEREVMRVRFICAgICAgIDI2DQotI2RlZmluZSBJRE5FVyAgICAgICAgICAyNw0KLQ0KLQ0KLSNkZWZpbmUgSURCVVNFUiAgICAgICAgMzANCi0jZGVmaW5lIElEQlVTRVIxICAgICAgIDMxDQotI2RlZmluZSBJREJVU0VSMiAgICAgICAzMg0KLSNkZWZpbmUgSURCVVNFUjMgICAgICAgMzMNCi0jZGVmaW5lIElEQlVTRVI0ICAgICAgIDM0DQotI2RlZmluZSBJREJVU0VSNSAgICAgICAzNQ0KLSNkZWZpbmUgSURCVVNFUjYgICAgICAgMzYNCi0jZGVmaW5lIElEQlVTRVI3ICAgICAgIDM3DQotI2RlZmluZSBJREJVU0VSOCAgICAgICAzOA0KLSNkZWZpbmUgSURCVVNFUjkgICAgICAgMzkNCi0NCi0jZGVmaW5lIElEREpPQk5BTUUgICAgIDUwDQotI2RlZmluZSBJRERQUklOVEVSICAgICA1MQ0KLQ0KLSNkZWZpbmUgSURTRVRVUCAgICAgICAgNjANCi0NCi0NCi0jZGVmaW5lIElESV9NS1NJQ09OICAgIDk5DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0jZGVmaW5lIE1JRF9ORVcgICAgICAgIDEwMA0KLSNkZWZpbmUgTUlEX09QRU4gICAgICAgMTAxDQotI2RlZmluZSBNSURfU0FWRSAgICAgICAxMDINCi0jZGVmaW5lIE1JRF9TQVZFQVMgICAgIDEwMw0KLSNkZWZpbmUgTUlEX1BSSU5UICAgICAgMTA0DQotI2RlZmluZSBNSURfUFJTRVRVUCAgICAxMDUNCi0jZGVmaW5lIE1JRF9TVEFUVVMgICAgIDEwNg0KLSNkZWZpbmUgTUlEX1FVSVQgICAgICAgMTA3DQotDQotI2RlZmluZSBNSURfQ1VUICAgICAgICAxMjENCi0jZGVmaW5lIE1JRF9DT1BZICAgICAgIDEyMg0KLSNkZWZpbmUgTUlEX1BBU1RFICAgICAgMTIzDQotI2RlZmluZSBNSURfQ0xFQVIgICAgICAxMjQNCi0jZGVmaW5lIE1JRF9DT1BZVE8gICAgIDEyNQ0KLSNkZWZpbmUgTUlEX1BBU1RFRlJPTSAgMTI2DQotDQotI2RlZmluZSBNSURfTkVXUFJPRCAgICAxNDANCi0jZGVmaW5lIE1JRF9ORVdCRUVSICAgIDE0MQ0KLSNkZWZpbmUgTUlEX1VTRVJDRkcgICAgMTQyDQotDQotI2RlZmluZSBNSURfUE9SRUdJRSAgICAxNTENCi0jZGVmaW5lIE1JRF9QT0JJRVJFICAgIDE1Mg0KLSNkZWZpbmUgTUlEX0RBWVNUT0NLICAgMTUzDQotI2RlZmluZSBNSURfUkVTRVJWRSAgICAxNTQNCi0jZGVmaW5lIE1JRF9DT0NLU0FMRSAgIDE1NQ0KLSNkZWZpbmUgTUlEX0RSWVNBTEUgICAgMTU2DQotI2RlZmluZSBNSURfQ09NUElMRSAgICAxNTcNCi0jZGVmaW5lIE1JRF9SRUNFVFRFUyAgIDE1OA0KLSNkZWZpbmUgTUlEX0hEICAgICAgICAgMTU5DQotI2RlZmluZSBNSURfVEVTVFBSTiAgICAxNjANCi0jZGVmaW5lIE1JRF9JTkZPRFNLICAgIDE2MQ0KLSNkZWZpbmUgTUlEX1NIQVJQICAgICAgMTYyDQotI2RlZmluZSBNSURfUEFTU1dPUkQgICAxNjMNCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSNkZWZpbmUgSUREVEVYVCAgICAgICAgMjAwDQotI2RlZmluZSBJRERUWFQxICAgICAgICAyMDENCi0jZGVmaW5lIElERFRYVDIgICAgICAgIDIwMg0KLSNkZWZpbmUgSUREVFhUMyAgICAgICAgMjAzDQotI2RlZmluZSBJRERUWFQ0ICAgICAgICAyMDQNCi0jZGVmaW5lIElERFRYVDUgICAgICAgIDIwNQ0KLSNkZWZpbmUgSUREVFhUNiAgICAgICAgMjA2DQotI2RlZmluZSBJRERUWFQ3ICAgICAgICAyMDcNCi0jZGVmaW5lIElERFRYVDggICAgICAgIDIwOA0KLSNkZWZpbmUgSUREVFhUOSAgICAgICAgMjA5DQotI2RlZmluZSBJRERUWFQxMCAgICAgICAyMTANCi0jZGVmaW5lIElERFRYVDExICAgICAgIDIxMQ0KLSNkZWZpbmUgSUREVFhUMTIgICAgICAgMjEyDQotI2RlZmluZSBJRERUWFQxMyAgICAgICAyMTMNCi0jZGVmaW5lIElERFRYVDE0ICAgICAgIDIxNA0KLSNkZWZpbmUgSUREVFhUMTUgICAgICAgMjE1DQotI2RlZmluZSBJRERUWFQxNiAgICAgICAyMTYNCi0jZGVmaW5lIElERFRYVDE3ICAgICAgIDIxNw0KLSNkZWZpbmUgSUREVFhUMTggICAgICAgMjE4DQotI2RlZmluZSBJRERUWFQxOSAgICAgICAyMTkNCi0NCi0jZGVmaW5lIElEREJVVFRPTjEgICAgIDIyMA0KLSNkZWZpbmUgSUREQlVUVE9OMiAgICAgMjIxDQotI2RlZmluZSBJRERCVVRUT04zICAgICAyMjINCi0jZGVmaW5lIElEREJVVFRPTjQgICAgIDIyMw0KLSNkZWZpbmUgSUREQlVUVE9ONSAgICAgMjI0DQotI2RlZmluZSBJRERCVVRUT042ICAgICAyMjUNCi0jZGVmaW5lIElEREJVVFRPTjcgICAgIDIyNg0KLSNkZWZpbmUgSUREQlVUVE9OOCAgICAgMjI3DQotI2RlZmluZSBJRERCVVRUT045ICAgICAyMjgNCi0jZGVmaW5lIElEREJVVFRPTjEwICAgIDIyOQ0KLQ0KLSNkZWZpbmUgSUREQ0hLQk9YMSAgICAgMjQwDQotI2RlZmluZSBJRERDSEtCT1gyICAgICAyNDENCi0jZGVmaW5lIElERENIS0JPWDMgICAgIDI0Mg0KLSNkZWZpbmUgSUREQ0hLQk9YNCAgICAgMjQzDQotI2RlZmluZSBJRERDSEtCT1g1ICAgICAyNDQNCi0jZGVmaW5lIElERENIS0JPWDYgICAgIDI0NQ0KLSNkZWZpbmUgSUREQ0hLQk9YNyAgICAgMjQ2DQotI2RlZmluZSBJRERDSEtCT1g4ICAgICAyNDcNCi0jZGVmaW5lIElERENIS0JPWDkgICAgIDI0OA0KLSNkZWZpbmUgSUREQ0hLQk9YMTAgICAgMjQ5DQotDQotI2RlZmluZSBJRERTQ1JPTEwxICAgICAyNTANCi0jZGVmaW5lIElERFNDUk9MTDIgICAgIDI1MQ0KLSNkZWZpbmUgSUREU0NST0xMMyAgICAgMjUyDQotI2RlZmluZSBJRERTQ1JPTEw0ICAgICAyNTMNCi0jZGVmaW5lIElERFNDUk9MTDUgICAgIDI1NA0KLSNkZWZpbmUgSUREU0NST0xMNiAgICAgMjU1DQotI2RlZmluZSBJRERTQ1JPTEw3ICAgICAyNTYNCi0jZGVmaW5lIElERFNDUk9MTDggICAgIDI1Nw0KLQ0KLSNkZWZpbmUgSUREU1RSMSAgICAgICAgMjAwMA0KLSNkZWZpbmUgSUREU1RSMiAgICAgICAgMjAwMQ0KLSNkZWZpbmUgSUREU1RSMyAgICAgICAgMjAwMg0KLSNkZWZpbmUgSUREU1RSNCAgICAgICAgMjAwMw0KLSNkZWZpbmUgSUREU1RSNSAgICAgICAgMjAwNA0KLSNkZWZpbmUgSUREU1RSNiAgICAgICAgMjAwNQ0KLSNkZWZpbmUgSUREU1RSNyAgICAgICAgMjAwNg0KLSNkZWZpbmUgSUREU1RSOCAgICAgICAgMjAwNw0KLSNkZWZpbmUgSUREU1RSOSAgICAgICAgMjAwOA0KLSNkZWZpbmUgSUREU1RSMTAgICAgICAgMjAwOQ0KLSNkZWZpbmUgSUREU1RSMTEgICAgICAgMjAxMA0KLSNkZWZpbmUgSUREU1RSMTIgICAgICAgMjAxMQ0KLSNkZWZpbmUgSUREU1RSMTMgICAgICAgMjAxMg0KLSNkZWZpbmUgSUREU1RSMTQgICAgICAgMjAxMw0KLSNkZWZpbmUgSUREU1RSMTUgICAgICAgMjAxNA0KLSNkZWZpbmUgSUREU1RSMTYgICAgICAgMjAxNQ0KLSNkZWZpbmUgSUREU1RSMTcgICAgICAgMjAxNg0KLSNkZWZpbmUgSUREU1RSMTggICAgICAgMjAxNw0KLSNkZWZpbmUgSUREU1RSMTkgICAgICAgMjAxOA0KLSNkZWZpbmUgSUREU1RSMjAgICAgICAgMjAxOQ0KLSNkZWZpbmUgSUREU1RSMjEgICAgICAgMjAyMA0KLSNkZWZpbmUgSUREU1RSMjIgICAgICAgMjAyMQ0KLSNkZWZpbmUgSUREU1RSMjMgICAgICAgMjAyMg0KLSNkZWZpbmUgSUREU1RSMjQgICAgICAgMjAyMw0KLSNkZWZpbmUgSUREU1RSMjUgICAgICAgMjAyNA0KLSNkZWZpbmUgSUREU1RSMjYgICAgICAgMjAyNQ0KLSNkZWZpbmUgSUREU1RSMjcgICAgICAgMjAyNg0KLSNkZWZpbmUgSUREU1RSMjggICAgICAgMjAyNw0KLSNkZWZpbmUgSUREU1RSMjkgICAgICAgMjAyOA0KLSNkZWZpbmUgSUREU1RSMzAgICAgICAgMjAyOQ0KLSNkZWZpbmUgSUREU1RSMzEgICAgICAgMjAzMA0KLSNkZWZpbmUgSUREU1RSMzIgICAgICAgMjAzMQ0KLSNkZWZpbmUgSUREU1RSMzMgICAgICAgMjAzMg0KLSNkZWZpbmUgSUREU1RSMzQgICAgICAgMjAzMw0KLSNkZWZpbmUgSUREU1RSMzUgICAgICAgMjAzNA0KLSNkZWZpbmUgSUREU1RSMzYgICAgICAgMjAzNQ0KLSNkZWZpbmUgSUREU1RSMzcgICAgICAgMjAzNg0KLSNkZWZpbmUgSUREU1RSMzggICAgICAgMjAzNw0KLSNkZWZpbmUgSUREU1RSMzkgICAgICAgMjAzOA0KLSNkZWZpbmUgSUREU1RSNDAgICAgICAgMjAzOQ0KLSNkZWZpbmUgSUREU1RSNDEgICAgICAgMjA0MA0KLSNkZWZpbmUgSUREU1RSNDIgICAgICAgMjA0MQ0KLSNkZWZpbmUgSUREU1RSNDMgICAgICAgMjA0Mg0KLSNkZWZpbmUgSUREU1RSNDQgICAgICAgMjA0Mw0KLSNkZWZpbmUgSUREU1RSNDUgICAgICAgMjA0NA0KLSNkZWZpbmUgSUREU1RSNDYgICAgICAgMjA0NQ0KLSNkZWZpbmUgSUREU1RSNDcgICAgICAgMjA0Ng0KLSNkZWZpbmUgSUREU1RSNDggICAgICAgMjA0Nw0KLSNkZWZpbmUgSUREU1RSNDkgICAgICAgMjA0OA0KLSNkZWZpbmUgSUREU1RSNTAgICAgICAgMjA0OQ0KLSNkZWZpbmUgSUREU1RSNTEgICAgICAgMjA1MA0KLSNkZWZpbmUgSUREU1RSNTIgICAgICAgMjA1MQ0KLSNkZWZpbmUgSUREU1RSNTMgICAgICAgMjA1Mg0KLSNkZWZpbmUgSUREU1RSNTQgICAgICAgMjA1Mw0KLSNkZWZpbmUgSUREU1RSNTUgICAgICAgMjA1NA0KLSNkZWZpbmUgSUREU1RSNTYgICAgICAgMjA1NQ0KLSNkZWZpbmUgSUREU1RSNTcgICAgICAgMjA1Ng0KLSNkZWZpbmUgSUREU1RSNTggICAgICAgMjA1Nw0KLSNkZWZpbmUgSUREU1RSNTkgICAgICAgMjA1OA0KLSNkZWZpbmUgSUREU1RSNjAgICAgICAgMjA1OQ0KLSNkZWZpbmUgSUREU1RSNjEgICAgICAgMjA2MA0KLSNkZWZpbmUgSUREU1RSNjIgICAgICAgMjA2MQ0KLSNkZWZpbmUgSUREU1RSNjMgICAgICAgMjA2Mg0KLSNkZWZpbmUgSUREU1RSNjQgICAgICAgMjA2Mw0KLSNkZWZpbmUgSUREU1RSNjUgICAgICAgMjA2NA0KLSNkZWZpbmUgSUREU1RSNjYgICAgICAgMjA2NQ0KLSNkZWZpbmUgSUREU1RSNjcgICAgICAgMjA2Ng0KLSNkZWZpbmUgSUREU1RSNjggICAgICAgMjA2Nw0KLSNkZWZpbmUgSUREU1RSNjkgICAgICAgMjA2OA0KLSNkZWZpbmUgSUREU1RSNzAgICAgICAgMjA2OQ0KLQ0KLQ0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2RlZmluZSBJRERERUZBVUxUUyAgICAxMDAxDQotI2RlZmluZSBJRERDSEVDS0JPWCAgICAxMDAyDQotI2RlZmluZSBJREROVUxMICAgICAgICAxMDAzDQotI2RlZmluZSBJRERSQkxFRlQgICAgICAxMDA0DQotI2RlZmluZSBJRERSQlJJR0hUICAgICAxMDA1DQotI2RlZmluZSBJRERSQkNFTlRFUiAgICAxMDA2DQotI2RlZmluZSBJRERMSVNUQk9YICAgICAxMDA3DQotI2RlZmluZSBJRERTQkggICAgICAgICAxMDA4DQotI2RlZmluZSBJRERTQlYgICAgICAgICAxMDA5DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0jZGVmaW5lIEFCT1VUX0RsZyAgICAgIDIwMDENCi0jZGVmaW5lIE5FV19EbGcgICAgICAgIDIwMDINCi0jZGVmaW5lIE9QRU5fRGxnICAgICAgIDIwMDMNCi0jZGVmaW5lIFNBVkVfRGxnICAgICAgIDIwMDQNCi0jZGVmaW5lIFNBVkVBU19EbGcgICAgIDIwMDUNCi0jZGVmaW5lIFBSSU5UX0RsZyAgICAgIDIwMDYNCi0jZGVmaW5lIEFCT1JUX0RsZyAgICAgIDIwMDcNCi0jZGVmaW5lIFBSU0VUVVBfRGxnICAgIDIwMDgNCi0jZGVmaW5lIFFVSVRfRGxnICAgICAgIDIwMDkNCi0NCi0jZGVmaW5lIEdFVE9CSl9EbGcgICAgIDIwMjANCi0jZGVmaW5lIE5FV1BST0RfRGxnICAgIDIwMjENCi0jZGVmaW5lIE5FV0JFRVJfRGxnICAgIDIwMjINCi0jZGVmaW5lIFVTRVJDRkdfRGxnICAgIDIwMjMNCi0jZGVmaW5lIFBPUkVHSUVfRGxnICAgIDIwMjQNCi0jZGVmaW5lIFBPQklFUkVfRGxnICAgIDIwMjUNCi0jZGVmaW5lIFBBU1NXT1JEX0RsZyAgIDIwMjYNCi0jZGVmaW5lIFRWUV9EbGcgICAgICAgIDIwMjcNCi0NCi0jZGVmaW5lIExURVhUT0tfRGxnICAgIDIwNzANCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSNkZWZpbmUgUkVEICAgICAgICAgICAgMHgwMDAwMDBGRg0KLSNkZWZpbmUgR1JFRU4gICAgICAgICAgMHgwMDAwRkYwMA0KLSNkZWZpbmUgQkxVRSAgICAgICAgICAgMHgwMEZGMDAwMA0KLSNkZWZpbmUgQ1lBTiAgICAgICAgICAgMHgwMEZGRkYwMA0KLSNkZWZpbmUgTUFHRU5UQSAgICAgICAgMHgwMEZGMDBGRg0KLSNkZWZpbmUgQkxBQ0sgICAgICAgICAgMHgwMDAwMDAwMA0KLSNkZWZpbmUgV0hJVEUgICAgICAgICAgMHgwMEZGRkZGRg0KLSNkZWZpbmUgR1JBWSAgICAgICAgICAgMHgwMDgwODA4MA0KLSNkZWZpbmUgTFRHUkFZICAgICAgICAgMHgwMEMwQzBDMA0KLSNkZWZpbmUgREtHUkFZICAgICAgICAgMHgwMDQwNDA0MA0KLQ0KLQ0KLRoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L21hcnRpbl9zaGlwMi93aWRnZXQuaWMyIGIvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LmljMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggM2UwZTBkNS4uMDAwMDAwMAotLS0gYS90ZXN0L21hcnRpbl9zaGlwMi93aWRnZXQuaWMyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LmljMyBiL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5pYzMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRiNjQyZGMuLjAwMDAwMDAKLS0tIGEvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LmljMworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5pY28gYi90ZXN0L21hcnRpbl9zaGlwMi93aWRnZXQuaWNvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4MjRkNTJkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvbWFydGluX3NoaXAyL3dpZGdldC5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L21hcnRpbl9zaGlwMi93aWRnZXQucmMgYi90ZXN0L21hcnRpbl9zaGlwMi93aWRnZXQucmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDVhODZjMjMuLjAwMDAwMDAKLS0tIGEvdGVzdC9tYXJ0aW5fc2hpcDIvd2lkZ2V0LnJjCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5MSBieSBUUkcgRUxFQ1RST05JSyAgICAgICAgICAgICAgICAgKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LlJDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gKiAJCSAgICAgICAgICB3aWRnZXQgUkVTU09VUkNFUyAgICAgICAgICAgICAgIAkgICAgICAqDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0jaW5jbHVkZSA8XEJDXElOQ0xVREVcV0lORE9XUy5IPg0KLSNpbmNsdWRlICJ3aWRnZXQuSCINCi0NCi0jZGVmaW5lIFRBQkdSUCAgICAgIFdTX1RBQlNUT1AgfCBXU19HUk9VUA0KLSNkZWZpbmUgTEJTVFlMRVMgICAgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZJU0lCTEUgfCBMQlNfU09SVCB8IFRBQkdSUA0KLSNkZWZpbmUgSFNDUk9MTCAgICAgV1NfVklTSUJMRSB8IFNCU19IT1JaIHwgU0JTX1RPUEFMSUdOICAgIHwgVEFCR1JQDQotI2RlZmluZSBWU0NST0xMICAgICBXU19WSVNJQkxFIHwgU0JTX1ZFUlQgfCBTQlNfTEVGVEFMSUdOICAgfCBUQUJHUlANCi0jZGVmaW5lIEJMQUNLUkVDVCAgIFNTX0JMQUNLUkVDVCAgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVANCi0jZGVmaW5lIFdISVRFRlJBTUUgIFNTX1dISVRFRlJBTUUgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVANCi0NCi0NCi1JQ09OXzEgIElDT04gd2lkZ2V0LklDTw0KLUlDT05fMiAgSUNPTiB3aWRnZXQuSUMyDQotSUNPTl8zICBJQ09OIHdpZGdldC5JQzMNCi0NCi1NRU5VXzEgTUVOVQ0KLUJFR0lODQotICBQT1BVUCAiJkZpbGUiDQotICBCRUdJTg0KLSAgICBNRU5VSVRFTSAiJk5ldyIsICAgICAgICAgICBNSURfTkVXDQotICAgIE1FTlVJVEVNICImT3BlbiIsICAgICAgICAgIE1JRF9PUEVODQotICAgIE1FTlVJVEVNICImU2F2ZSIsICAgICAgICAgIE1JRF9TQVZFDQotICAgIE1FTlVJVEVNICJTYXZlICZBcyIsICAgICAgIE1JRF9TQVZFQVMNCi0gICAgTUVOVUlURU0gU0VQQVJBVE9SDQotICAgIE1FTlVJVEVNICImUXVpdCEiLCAgICAgICAgIE1JRF9RVUlUDQotICBFTkQNCi1FTkQNCi0NCi0NCi0NCi0NCi1BQk9VVF9EbGcgRElBTE9HIDEwMCwgMTAwLCAxNTQsICA3NQ0KLVNUWUxFIFdTX1BPUFVQIHwgV1NfRExHRlJBTUUNCi1CRUdJTg0KLSAgSUNPTiAgIndpZGdldCIgICAgICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LCAgMjMsICAgMCwgICAwDQotICBJQ09OICAiREtJQ09OMiIgICAgICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwLCAgMjMsICAgMCwgICAwDQotICBJQ09OICAiREtJQ09OMyIgICAgICAgICAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwLCAgMjMsICAgMCwgICAwDQotICBDVEVYVCAiQWJvdXQgd2lkZ2V0IEludmVudG9yeSBDb250cm9sZXIiICAgICAtMSwgIDAsIDE0LDE1NCwgOA0KLSAgQ1RFWFQgIlZlcnNpb24gMC41MCIgICAgICAgICAgICAgICAgICAgICAgICAtMSwgMzAsIDM0LCA5NCwgOA0KLSAgQ1RFWFQgIkNvcHlyaWdodCCpIDE5OTEsIFRSRyBFbGVjdHJvbmlrIiAgLTEsICAwLCA0NywxNTQsIDkNCi0gIERFRlBVU0hCVVRUT04gIk9rIiAgICAgICAgICAgICAgICAgICAgICAgIElET0ssIDYxLCA1OSwgMzIsIDE0LCBXU19HUk9VUA0KLUVORA0KLQ0KLQ0KLUxURVhUT0tfRGxnIERJQUxPRyAxMDAsIDEwMCwgMzAwLCAxMjANCi1TVFlMRSAgV1NfUE9QVVAgfCBXU19ETEdGUkFNRQ0KLUJFR0lODQotICBMVEVYVCAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUREVFhUMSwgICAyMCwgMTUsMTE4LCAxMg0KLSAgTFRFWFQgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIElERFRYVDIsICAgMjAsIDMwLDExOCwgMjUNCi0gIExURVhUICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRERUWFQzLCAgIDIwLCA0NSwxMTgsIDM1DQotICBMVEVYVCAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUREVFhUMywgICAyMCwgNjAsMTE4LCAzNQ0KLSAgREVGUFVTSEJVVFRPTiAiT0siLCAgICAgICAgICAgICAgICAgIElET0ssICAgICAxNTAsIDg1LCA0MCwgMTQsIFRBQkdSUA0KLUVORA0KLQ0KLQ0KLVNUUklOR1RBQkxFDQotQkVHSU4NCi1JRERTVFIxLCAgICAiV2luZSBUZXN0IFByb2dyYW0iDQotSUREU1RSMiwgICAgIiINCi1JRERTVFIzLCAgICAiIg0KLUlERFNUUjQsICAgICIiDQotSUREU1RSNSwgICAgIiINCi1JRERTVFI2LCAgICAiIg0KLUlERFNUUjcsICAgICIiDQotSUREU1RSOCwgICAgIiINCi1JRERTVFI5LCAgICAiIg0KLUlERFNUUjEwLCAgICIiDQotRU5EDQotDQotGgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbWFydGluX3NoaXA0L3dpZGdldC5jIGIvdGVzdC9tYXJ0aW5fc2hpcDQvd2lkZ2V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRkMmRmY2YuLjAwMDAwMDAKLS0tIGEvdGVzdC9tYXJ0aW5fc2hpcDQvd2lkZ2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiAgICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5MSBieSBUUkcgRUxFQ1RST05JSyAgICAgICAgICAgICAgICAgKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldC5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCi0gKiAgICAgICAgICAgICAgd2lkZ2V0IEludmVudG9yeSBDb250cm9sZXIgICBQQVJUICMgMSAgICAgICAgICAgICAgICAgKg0KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotI2luY2x1ZGUgPFdJTkRPV1MuSD4NCi0jaW5jbHVkZSAiU1RESU8uaCINCi0jaW5jbHVkZSAiU1RETElCLmgiDQotI2luY2x1ZGUgIlNUREFSRy5oIg0KLSNpbmNsdWRlICJTVFJJTkcuSCINCi0NCi0jaW5jbHVkZSAid2lkZ2V0LkgiDQotI2luY2x1ZGUgIndpZGdldC5WQVIiDQotI2luY2x1ZGUgIndpZGdldC5QIg0KLQ0KLSNkZWZpbmUgTm9SRUYoYSkgYT1hDQotDQotSFdORAkJaFduZEJ1dDsNCi1IV05ECQloV25kQ2hrOw0KLUhXTkQJCWhXbmRSYWRpbzsNCi1IV05ECQloV25kTEJveDsNCi1IV05ECQloV25kTEJveDI7DQotSFdORAkJaFduZExCb3gzOw0KLUhXTkQJCWhXbmRMQm94NDsNCi1IV05ECQloV25kU2Nyb2w7DQotSFdORAkJaFduZFNjcm8yOw0KLUhXTkQJCWhXbmRTY3JvMzsNCi1IV05ECQloV25kU3RhdDsNCi1IV05ECQloV25kRWRpdDsNCi1IV05ECQloV25kQ0JveDsNCi1pbnQJCXgsIHk7DQotDQotSEJSVVNICWhSRURCcnVzaDsNCi1IQlJVU0gJaEdSRUVOQnJ1c2g7DQotSEJSVVNICWhCTFVFQnJ1c2g7DQotSEJSVVNICWhHUkFZQnJ1c2g7DQotSEJJVE1BUCAgaEJpdE1hcDsNCi1IQklUTUFQICBoQml0TWFwMjsNCi1IQklUTUFQICBoQml0TWFwMzsNCi1CSVRNQVAgICBCaXRNYXA7DQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotDQotaW50IFBBU0NBTCBXaW5NYWluKEhBTkRMRSBoSW5zdGFuY2UsSEFORExFIGhQcmV2SW5zdGFuY2UsDQotICAgICAgICAgICAgICAgICAgIExQU1RSIGxwc3pDbWRMaW5lLGludCBuQ21kU2hvdykNCi17DQotV05EQ0xBU1MgIHduZENsYXNzOw0KLU1TRyAgICAgICBtc2c7DQotSFdORCAgICAgIGhXbmQ7DQotSERDICAgICAgIGhEQzsNCi1jaGFyICAgICAgQ1s0MF07DQotaW50ICAgICAgIFg7DQotTm9SRUYobHBzekNtZExpbmUpOw0KLWlmICggIWhQcmV2SW5zdGFuY2UgKQ0KLSAgICB7DQotICAgIHduZENsYXNzLnN0eWxlICAgICAgICAgICA9IENTX0hSRURSQVcgfCBDU19WUkVEUkFXIDsNCi0gICAgd25kQ2xhc3MubHBmblduZFByb2MgICAgID0gKFdORFBST0MpV25kUHJvYzsNCi0gICAgd25kQ2xhc3MuY2JDbHNFeHRyYSAgICAgID0gMDsNCi0gICAgd25kQ2xhc3MuY2JXbmRFeHRyYSAgICAgID0gMDsNCi0gICAgd25kQ2xhc3MuaEluc3RhbmNlICAgICAgID0gaEluc3RhbmNlOw0KLSAgICB3bmRDbGFzcy5oSWNvbiAgICAgICAgICAgPSBMb2FkSWNvbihoSW5zdGFuY2UsKExQU1RSKSJJQ09OXzEiKTsNCi0gICAgd25kQ2xhc3MuaEN1cnNvciAgICAgICAgID0gTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cgKTsNCi0gICAgd25kQ2xhc3MuaGJyQmFja2dyb3VuZCAgID0gR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0ggKTsNCi0gICAgd25kQ2xhc3MubHBzek1lbnVOYW1lICAgID0gc3pBcHBOYW1lOw0KLSAgICB3bmRDbGFzcy5scHN6Q2xhc3NOYW1lICAgPSBzekFwcE5hbWU7DQotICAgIGlmICghUmVnaXN0ZXJDbGFzcygmd25kQ2xhc3MpKQ0KLSAgICAgICAgcmV0dXJuIEZBTFNFOw0KLSAgICB9DQotaFduZCA9IENyZWF0ZVdpbmRvdyhzekFwcE5hbWUsICJ3aWRnZXQgdGVzdCBwcm9ncmFtIiwNCi0gICAgICAgICBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19CT1JERVIgfCBXU19WSVNJQkxFLCA1MCwgNTAsDQotICAgICAgICAgNDAwLCA1MDAsIE5VTEwsIE5VTEwsIGhJbnN0YW5jZSwgTlVMTCk7DQotaFduZE1haW4gPSBoV25kOw0KLWhJbnN0ID0gaEluc3RhbmNlOw0KLWhEQ01haW4gPSBHZXREQyhoV25kTWFpbik7DQotaFJFREJydXNoICAgID0gQ3JlYXRlU09MSURCcnVzaCgweDAwMDAwMEZGKTsNCi1oR1JFRU5CcnVzaCAgPSBDcmVhdGVTT0xJREJydXNoKDB4MDAwMDdGMDApOw0KLWhCTFVFQnJ1c2ggICA9IENyZWF0ZVNPTElEQnJ1c2goMHgwMEZGMDAwMCk7DQotaEdSQVlCcnVzaCAgID0gQ3JlYXRlU09MSURCcnVzaCgweDAwQzBDMEMwKTsNCi0NCi1Jbml0V2lkZ2V0cygpOw0KLQ0KLXdoaWxlIChHZXRNZXNzYWdlKCZtc2csIE5VTEwsIDAsIDApKQ0KLSAgICB7DQotICAgIFRyYW5zbGF0ZU1lc3NhZ2UoJm1zZyApOw0KLSAgICBEaXNwYXRjaE1lc3NhZ2UoJm1zZyApOw0KLSAgICB9DQotRGVsZXRlT2JqZWN0KGhSRURCcnVzaCk7DQotRGVsZXRlT2JqZWN0KGhHUkVFTkJydXNoKTsNCi1EZWxldGVPYmplY3QoaEJMVUVCcnVzaCk7DQotRGVsZXRlT2JqZWN0KGhHUkFZQnJ1c2gpOw0KLWlmIChoQml0TWFwICE9IE5VTEwpIERlbGV0ZU9iamVjdChoQml0TWFwKTsNCi1pZiAoaEJpdE1hcDIgIT0gTlVMTCkgRGVsZXRlT2JqZWN0KGhCaXRNYXAyKTsNCi1pZiAoaEJpdE1hcDMgIT0gTlVMTCkgRGVsZXRlT2JqZWN0KGhCaXRNYXAzKTsNCi1SZWxlYXNlREMoaFduZE1haW4sIGhEQyk7DQotcmV0dXJuKDApOw0KLX0NCi0NCi0NCi12b2lkIEluaXRXaWRnZXRzKCkNCi17DQotaFduZEJ1dCA9IENyZWF0ZVdpbmRvdygiQlVUVE9OIiwgIkJ1dHRvbiAjMSIsDQotICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgQlNfUFVTSEJVVFRPTiwgDQotICAgICAgICAgICAgMjMwLCA0MCwgODAsIDMwLCBoV25kTWFpbiwgMTAwMSwgaEluc3QsIE5VTEwpOw0KLWhXbmRTY3JvbCA9IENyZWF0ZVdpbmRvdygiU0NST0xMQkFSIiwgIlNjcm9sbCAjMSIsDQotICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgU0JTX1ZFUlQsDQotCQkJCTIwMCwgMTUwLCAxNSwgMTAwLCBoV25kTWFpbiwgMTAwNCwgaEluc3QsIE5VTEwpOw0KLWhXbmRTY3JvMiA9IENyZWF0ZVdpbmRvdygiU0NST0xMQkFSIiwgIlNjcm9sbCAjMiIsDQotICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgU0JTX0hPUlosDQotCQkJCTUwLCAxNTAsIDEwMCwgMTUsIGhXbmRNYWluLCAxMDA1LCBoSW5zdCwgTlVMTCk7DQotaFduZFNjcm8zID0gQ3JlYXRlV2luZG93KCJTQ1JPTExCQVIiLCAiU2Nyb2xsICMzIiwNCi0gICAgICAgICAgICBXU19DSElMRCB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX1ZJU0lCTEUgfCBTQlNfU0laRUJPWCwNCi0JCQkJNTAsIDE4MCwgMjUsIDI1LCBoV25kTWFpbiwgMTAwNiwgaEluc3QsIE5VTEwpOw0KLXggPSB5ID0gMjU7DQotU2V0VmVydFNjcm9sbChOVUxMLCBoV25kU2Nyb2wsIDI1LCAwLCA1MCk7DQotU2V0U2Nyb2xsUmFuZ2UoaFduZFNjcm8yLCBTQl9DVEwsIDAsIDUwLCBUUlVFKTsNCi1TZXRTY3JvbGxQb3MoaFduZFNjcm8yLCBTQl9DVEwsIDI1LCBUUlVFKTsNCi1oV25kTEJveCA9IENyZWF0ZVdpbmRvdygiTElTVEJPWCIsICIiLA0KLSAgICAgICAgICAgIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBMQlNfTk9USUZZLA0KLQkJCQkyMzAsIDE2MCwgMTUwLCAxMDAsIGhXbmRNYWluLCAxMDA0LCBoSW5zdCwgTlVMTCk7DQotU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiTGlzdEJveCBpdGVtICMxIik7DQotaFduZFN0YXQgPSBDcmVhdGVXaW5kb3coIlNUQVRJQyIsICJTdGF0aWMgIzEiLA0KLSAgICAgICAgICAgIFdTX0NISUxEIHwgV1NfQ0xJUFNJQkxJTkdTIHwgV1NfVklTSUJMRSB8IFNTX0xFRlQsIA0KLSAgICAgICAgICAgIDMwLCAxMjAsIDE1MCwgMjAsIGhXbmRNYWluLCAxMDExLCBoSW5zdCwgTlVMTCk7DQotU2VuZE1lc3NhZ2UoaFduZFN0YXQsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pIlN0YXRpYyBMZWZ0IFRleHQiKTsNCi1oV25kQ0JveCA9IENyZWF0ZVdpbmRvdygiQ09NQk9CT1giLCAiQ29tYm8gIzEiLA0KLQkJV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUiB8IENCU19EUk9QRE9XTkxJU1QsDQotCQkyMzAsIDI3MCwgMTUwLCAxMDAsIGhXbmRNYWluLCAxMDYwLCBoSW5zdCwgTlVMTCk7DQotU2VuZE1lc3NhZ2UoaFduZENCb3gsIENCX0FERFNUUklORywgMCwgKExQQVJBTSkiQ29tYm9Cb3ggaXRlbSAjMSIpOw0KLVNlbmRNZXNzYWdlKGhXbmRDQm94LCBDQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkNvbWJvQm94IGl0ZW0gIzIiKTsNCi1TZW5kTWVzc2FnZShoV25kQ0JveCwgQ0JfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJDb21ib0JveCBpdGVtICMzIik7DQotU2VuZE1lc3NhZ2UoaFduZENCb3gsIENCX0FERFNUUklORywgMCwgKExQQVJBTSkiQ29tYm9Cb3ggaXRlbSAjNCIpOw0KLVNlbmRNZXNzYWdlKGhXbmRDQm94LCBDQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkNvbWJvQm94IGl0ZW0gIzUiKTsNCi1TZW5kTWVzc2FnZShoV25kQ0JveCwgQ0JfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJDb21ib0JveCBpdGVtICM2Iik7DQotfQ0KLQ0KLQ0KLQ0KLWxvbmcgRkFSIFBBU0NBTCBXbmRQcm9jKEhXTkQgaFduZCwgdW5zaWduZWQgTWVzc2FnZSwgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQ0KLXsNCi1pbnQJU2hpZnRTdGF0ZTsNCi1MUERSQVdJVEVNU1RSVUNUIGRpczsNCi1IREMgICAgICBoTWVtREM7DQotSEJSVVNICWhCcnVzaDsNCi1jaGFyCUNbMTI4XTsNCi1TaGlmdFN0YXRlID0gR2V0S2V5U3RhdGUoVktfU0hJRlQpOw0KLXN3aXRjaChNZXNzYWdlKQ0KLSAgICB7DQotICAgIGNhc2UgV01fQ09NTUFORDoNCi0JCSAgaWYgKExPV09SRChsUGFyYW0pICE9IDApDQotCQkJICAgew0KLQkJICAJCXNwcmludGYoQywgIk1BSU4gV01fQ09NTUFORCB3UGFyYW09JVggbFBhcmFtPSVsWCAhISEiLCB3UGFyYW0sIGxQYXJhbSk7DQotCQkgIAkJVGV4dE91dChoRENNYWluLCAyNSwgMjgwLCBDLCBzdHJsZW4oQykpOw0KLQkJCSAgIH0NCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIFdNX0tFWURPV046DQotCQkgIHNwcmludGYoQywgIldNX0tFWURPV04gISEhIik7DQotCQkgIFRleHRPdXQoaERDTWFpbiwgMjUsIDQwLCBDLCBzdHJsZW4oQykpOw0KLQkJICBLZXlEb3duKGhXbmQsIE1lc3NhZ2UsIHdQYXJhbSk7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgY2FzZSBXTV9DSEFSOg0KLQkJICBzcHJpbnRmKEMsICJXTV9DSEFSICEhISIpOw0KLQkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCA1MCwgQywgc3RybGVuKEMpKTsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIFdNX0NUTENPTE9SOg0KLQkJICBzd2l0Y2goSElXT1JEKGxQYXJhbSkpDQotCQkJICAgew0KLQkJCQljYXNlIENUTENPTE9SX1NDUk9MTEJBUjoNCi0gICAgICAgICAgICAgICAgcmV0dXJuKGhCTFVFQnJ1c2gpOw0KLQkJCQljYXNlIENUTENPTE9SX0xJU1RCT1g6DQotCQkgICAgICAgICAgU2V0QmtDb2xvcigoSERDKXdQYXJhbSwgMHgwMEMwQzAwMCk7DQotICAgICAgICAgICAgICAgIFNldFRleHRDb2xvcigoSERDKXdQYXJhbSwgMHgwMEZGMDAwMCk7DQotICAgICAgICAgICAgICAgIHJldHVybihoR1JFRU5CcnVzaCk7DQotCQkJCWNhc2UgQ1RMQ09MT1JfU1RBVElDOg0KLQkJICAgICAgICAgIFNldEJrQ29sb3IoKEhEQyl3UGFyYW0sIDB4MDBDMEMwQzApOw0KLSAgICAgICAgICAgICAgICBTZXRUZXh0Q29sb3IoKEhEQyl3UGFyYW0sIDB4MDAwMEZGRkYpOw0KLSAgICAgICAgICAgICAgICByZXR1cm4oaFJFREJydXNoKTsNCi0JCQkJfQ0KLSAgICAgICAgcmV0dXJuKChIQlJVU0gpTlVMTCk7DQotDQotICAgIGNhc2UgV01fTEJVVFRPTkRPV046DQotICAgICAgICBicmVhazsNCi0NCi0gICAgY2FzZSBXTV9MQlVUVE9OVVA6DQotICAgICAgICBicmVhazsNCi0NCi0gICAgY2FzZSBXTV9SQlVUVE9ORE9XTjoNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIFdNX1JCVVRUT05VUDoNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIFdNX01PVVNFTU9WRToNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIFdNX1ZTQ1JPTEw6DQotCQkgIHNwcmludGYoQywgIldNX1ZTQ1JPTEwgJVggJWxYICEhISIsIHdQYXJhbSwgbFBhcmFtKTsNCi0JCSAgVGV4dE91dChoRENNYWluLCAyNSwgMzgwLCBDLCBzdHJsZW4oQykpOw0KLQkJICBEb19EbGdfVmVydFNjcm9sbChoV25kLCB3UGFyYW0sIGxQYXJhbSwgJnksIDAsIDUwKTsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIFdNX0hTQ1JPTEw6DQotCQkgIHNwcmludGYoQywgIldNX0hTQ1JPTEwgJVggJWxYICEhISIsIHdQYXJhbSwgbFBhcmFtKTsNCi0JCSAgVGV4dE91dChoRENNYWluLCAyNSwgMzgwLCBDLCBzdHJsZW4oQykpOw0KLQkJICBEb19EbGdfSG9yelNjcm9sbChoV25kLCB3UGFyYW0sIGxQYXJhbSwgJngsIDAsIDUwKTsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIFdNX0RSQVdJVEVNOg0KLQkJICBzcHJpbnRmKEMsICJXTV9EUkFXSVRFTSAlWCAlbFggISEhIiwgd1BhcmFtLCBsUGFyYW0pOw0KLQkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCAzODAsIEMsIHN0cmxlbihDKSk7DQotCQkgIGlmIChsUGFyYW0gPT0gMEwpIGJyZWFrOw0KLQkJICBpZiAod1BhcmFtID09IDApIGJyZWFrOw0KLQkJICBkaXMgPSAoTFBEUkFXSVRFTVNUUlVDVClsUGFyYW07DQotCQkgIGlmICgoZGlzLT5DdGxUeXBlID09IE9EVF9MSVNUQk9YKSAmJiAoZGlzLT5DdGxJRCA9PSAxMDYyKSkgew0KLQkJCQloQnJ1c2ggPSBTZWxlY3RPYmplY3QoZGlzLT5oREMsIEdldFN0b2NrT2JqZWN0KExUR1JBWV9CUlVTSCkpOw0KLQkJCQlTZWxlY3RPYmplY3QoZGlzLT5oREMsIGhCcnVzaCk7DQotCQkJCUZpbGxSZWN0KGRpcy0+aERDLCAmZGlzLT5yY0l0ZW0sIGhCcnVzaCk7DQotCQkJCXNwcmludGYoQywgIkl0ZW0gIyVYIiwgZGlzLT5pdGVtSUQpOw0KLQkJCSAgIGlmIChkaXMtPml0ZW1EYXRhID09IE5VTEwpIGJyZWFrOw0KLQkJCQlUZXh0T3V0KGRpcy0+aERDLCBkaXMtPnJjSXRlbS5sZWZ0LA0KLQkJCQkJZGlzLT5yY0l0ZW0udG9wLCBDLCBzdHJsZW4oQykpOw0KLQkJCQl9DQotCQkgIGlmICgoZGlzLT5DdGxUeXBlID09IE9EVF9MSVNUQk9YKSAmJiAoZGlzLT5DdGxJRCA9PSAxMDYzKSkgew0KLQkJCQloQnJ1c2ggPSBTZWxlY3RPYmplY3QoZGlzLT5oREMsIEdldFN0b2NrT2JqZWN0KExUR1JBWV9CUlVTSCkpOw0KLQkJCQlTZWxlY3RPYmplY3QoZGlzLT5oREMsIGhCcnVzaCk7DQotCQkJCUZpbGxSZWN0KGRpcy0+aERDLCAmZGlzLT5yY0l0ZW0sIGhCcnVzaCk7DQotCQkJICAgaWYgKGRpcy0+aXRlbURhdGEgPT0gTlVMTCkgYnJlYWs7DQotCQkJCVRleHRPdXQoZGlzLT5oREMsIGRpcy0+cmNJdGVtLmxlZnQsCWRpcy0+cmNJdGVtLnRvcCwNCi0JCQkJCShMUFNUUilkaXMtPml0ZW1EYXRhLCBsc3RybGVuKChMUFNUUilkaXMtPml0ZW1EYXRhKSk7DQotCQkJCX0NCi0JCSAgaWYgKChkaXMtPkN0bFR5cGUgPT0gT0RUX0xJU1RCT1gpICYmIChkaXMtPkN0bElEID09IDEwNjQpKSB7DQotCQkJCWhCcnVzaCA9IFNlbGVjdE9iamVjdChkaXMtPmhEQywgR2V0U3RvY2tPYmplY3QoTFRHUkFZX0JSVVNIKSk7DQotCQkJCVNlbGVjdE9iamVjdChkaXMtPmhEQywgaEJydXNoKTsNCi0JCQkJRmlsbFJlY3QoZGlzLT5oREMsICZkaXMtPnJjSXRlbSwgaEJydXNoKTsNCi0JCQkJaE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGRpcy0+aERDKTsNCi0JCQkJU2VsZWN0T2JqZWN0KGhNZW1EQyxoQml0TWFwKTsNCi0JCQkJQml0Qmx0KGRpcy0+aERDLCBkaXMtPnJjSXRlbS5sZWZ0LAlkaXMtPnJjSXRlbS50b3AsDQotCQkJCQkJQml0TWFwLmJtV2lkdGgsIEJpdE1hcC5ibUhlaWdodCwgaE1lbURDLCAwLCAwLCBTUkNDT1BZKTsNCi0JCQkJRGVsZXRlREMoaE1lbURDKTsNCi0JCQkJc3ByaW50ZihDLCAiSXRlbSAjJVgiLCBkaXMtPml0ZW1JRCk7DQotCQkJCVRleHRPdXQoZGlzLT5oREMsIGRpcy0+cmNJdGVtLmxlZnQgKyBCaXRNYXAuYm1XaWR0aCwNCi0JCQkJCWRpcy0+cmNJdGVtLnRvcCwgQywgc3RybGVuKEMpKTsNCi0vLwkJCSAgIGlmIChkaXMtPml0ZW1EYXRhID09IE5VTEwpIGJyZWFrOw0KLS8vCQkJCVRleHRPdXQoZGlzLT5oREMsIGRpcy0+cmNJdGVtLmxlZnQgKyBCaXRNYXAuYm1XaWR0aCwNCi0vLwkJCQkJCWRpcy0+cmNJdGVtLnRvcCwgKExQU1RSKWRpcy0+aXRlbURhdGEsDQotLy8JCQkJCQlsc3RybGVuKChMUFNUUilkaXMtPml0ZW1EYXRhKSk7DQotCQkJCX0NCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIFdNX1BBSU5UOg0KLSAgICAgICAgRG9QYWludChoV25kKTsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIFdNX0RFU1RST1k6DQotICAgICAgICBQb3N0UXVpdE1lc3NhZ2UoMCk7DQotICAgICAgICBicmVhazsNCi0NCi0gICAgZGVmYXVsdDoNCi0gICAgICAgIHJldHVybiBEZWZXaW5kb3dQcm9jKGhXbmQsIE1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsNCi0gICAgfQ0KLXJldHVybigwKTsNCi19DQotDQotDQotDQotQk9PTCBLZXlEb3duKEhXTkQgaFduZCwgdW5zaWduZWQgTWVzc2FnZSwgV09SRCB3UGFyYW0pDQotew0KLVdPUkQJCQl3UmV0Ow0KLVVJTlQJCQl1UmV0Ow0KLURXT1JECQkJZHdSZXQ7DQotSERDICAgICAgaE1lbURDOw0KLWNoYXIJCQlDWzEyOF07DQotY2hhcgkJCUMyWzY0XTsNCi1Ob1JFRihoV25kKTsNCi1Ob1JFRihNZXNzYWdlKTsNCi1zcHJpbnRmKEMsICJLZXlEb3duICV4ICEhISIsIHdQYXJhbSk7DQotVGV4dE91dChoRENNYWluLCAyNSwgMTAwLCBDLCBzdHJsZW4oQykpOw0KLXN3aXRjaCAod1BhcmFtKQ0KLSAgICB7DQotICAgIGNhc2UgVktfSE9NRTogICAgICAgICAgICAvKiAnSE9NRScgS0VZICAgICAgICAgKi8NCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFZLX0xFRlQ6ICAgICAgICAgICAgLyogJ0xFRlQnIENVUlNPUiBLRVkgICovDQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSBWS19SSUdIVDogICAgICAgICAgIC8qICdSSUdIVCcgQ1VSU09SIEtFWSAqLw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgVktfVVA6ICAgICAgICAgICAgICAvKiAnVVAnIENVUlNPUiBLRVkgICAgKi8NCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlIFZLX0RPV046ICAgICAgICAgICAgLyogJ0RPV04nIENVUlNPUiBLRVkgICovDQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSBWS19QUklPUjogICAgICAgICAgIC8qICdQR1VQJyBDVVJTT1IgS0VZICAqLw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgVktfTkVYVDogICAgICAgICAgICAvKiAnUEdETicgQ1VSU09SIEtFWSAgKi8NCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICcxJzoNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICcyJzoNCi0JCSAgaFduZFN0YXQgPSBDcmVhdGVXaW5kb3coIlNUQVRJQyIsICJTdGF0aWMgIzIiLA0KLSAgICAgICAgICAgIAkJCVdTX0NISUxEIHwgV1NfQ0xJUFNJQkxJTkdTIHwgV1NfVklTSUJMRSB8IFNTX0NFTlRFUiwgDQotICAgICAgICAgICAgCQkJMzAsIDE1MCwgMTUwLCAyMCwgaFduZE1haW4sIDEwMTIsIGhJbnN0LCBOVUxMKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZFN0YXQsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pIlN0YXRpYyBDZW50ZXIgVGV4dCIpOw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgJzMnOg0KLQkJICBoV25kU3RhdCA9IENyZWF0ZVdpbmRvdygiU1RBVElDIiwgIlN0YXRpYyAjMyIsDQotICAgICAgICAgICAgCQkJV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgU1NfUklHSFQsIA0KLSAgICAgICAgICAgIAkJCTMwLCAxODAsIDE1MCwgMjAsIGhXbmRNYWluLCAxMDEzLCBoSW5zdCwgTlVMTCk7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRTdGF0LCBXTV9TRVRURVhULCAwLCAoTFBBUkFNKSJTdGF0aWMgUmlnaHQgVGV4dCIpOw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgJzQnOg0KLQkJICBoV25kU3RhdCA9IENyZWF0ZVdpbmRvdygiU1RBVElDIiwgIlN0YXRpYyAjNCIsDQotICAgICAgICAgICAgCQkJV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgU1NfU0lNUExFLCANCi0gICAgICAgICAgICAJCQkzMCwgMjEwLCAxNTAsIDIwLCBoV25kTWFpbiwgMTAxNCwgaEluc3QsIE5VTEwpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kU3RhdCwgV01fU0VUVEVYVCwgMCwgKExQQVJBTSkiU1NfU0lNUExFIik7DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnNSc6DQotCQkgIGhXbmRTdGF0ID0gQ3JlYXRlV2luZG93KCJTVEFUSUMiLCAiU3RhdGljICM1IiwNCi0gICAgICAgICAgICAJCQlXU19DSElMRCB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX1ZJU0lCTEUgfCBTU19HUkFZUkVDVCwgDQotICAgICAgICAgICAgCQkJMzAsIDI0MCwgMTUwLCAyMCwgaFduZE1haW4sIDEwMTUsIGhJbnN0LCBOVUxMKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZFN0YXQsIFdNX1NFVFRFWFQsIDAsIChMUEFSQU0pIlNTX0dSQVlSRUNUIik7DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnQSc6DQotCQkgIGhXbmRTdGF0ID0gQ3JlYXRlV2luZG93KCJTVEFUSUMiLCAiU3RhdGljICM2IiwNCi0gICAgICAgICAgICAJCQlXU19DSElMRCB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX1ZJU0lCTEUgfCBTU19CTEFDS1JFQ1QsIA0KLSAgICAgICAgICAgIAkJCTMwLCAyNDAsIDE1MCwgMjAsIGhXbmRNYWluLCAxMDE2LCBoSW5zdCwgTlVMTCk7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRTdGF0LCBXTV9TRVRURVhULCAwLCAoTFBBUkFNKSJTU19CTEFDS1JFQ1QiKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICdDJzoNCi0JCSAgaWYgKGhCaXRNYXAyID09IE5VTEwpIHsNCi0JCSAgCQloQml0TWFwMiA9IExvYWRCaXRtYXAoaEluc3QsICJMQklDT04iKTsNCi0JCSAgCQlHZXRPYmplY3QoaEJpdE1hcDIsIHNpemVvZihCSVRNQVApLCAoTFBTVFIpJkJpdE1hcCk7DQotCQkJCX0NCi0JCSAgaE1lbURDID0gQ3JlYXRlQ29tcGF0aWJsZURDKGhEQ01haW4pOw0KLQkJICBTZWxlY3RPYmplY3QoaE1lbURDLCBoQml0TWFwMik7DQotCQkgIEJpdEJsdChoRENNYWluLCAxMCwgMTAsIEJpdE1hcC5ibVdpZHRoLA0KLQkJCQkJCUJpdE1hcC5ibUhlaWdodCwgaE1lbURDLCAwLCAwLCBTUkNDT1BZKTsNCi0JCSAgRGVsZXRlREMoaE1lbURDKTsNCi0JCSAgc3ByaW50ZihDLCAiRHJhd0JpdG1hcCIpOw0KLQkJICBUZXh0T3V0KGhEQ01haW4sIDI1LCAzMjAsIEMsIHN0cmxlbihDKSk7DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnRCc6DQotCQkgIGlmIChoQml0TWFwMyA9PSBOVUxMKSB7DQotCQkgIAkJaEJpdE1hcDMgPSBMb2FkQml0bWFwKGhJbnN0LCBNQUtFSU5UUkVTT1VSQ0UoMzMzMykpOw0KLQkJICAJCUdldE9iamVjdChoQml0TWFwMywgc2l6ZW9mKEJJVE1BUCksIChMUFNUUikmQml0TWFwKTsNCi0JCQkJfQ0KLQkJICBoTWVtREMgPSBDcmVhdGVDb21wYXRpYmxlREMoaERDTWFpbik7DQotCQkgIFNlbGVjdE9iamVjdChoTWVtREMsIGhCaXRNYXAzKTsNCi0JCSAgQml0Qmx0KGhEQ01haW4sIDgwLCAxMCwgQml0TWFwLmJtV2lkdGgsDQotCQkJCQkJQml0TWFwLmJtSGVpZ2h0LCBoTWVtREMsIDAsIDAsIFNSQ0NPUFkpOw0KLQkJICBEZWxldGVEQyhoTWVtREMpOw0KLQkJICBzcHJpbnRmKEMsICJEcmF3Qml0bWFwIik7DQotCQkgIFRleHRPdXQoaERDTWFpbiwgMjUsIDMyMCwgQywgc3RybGVuKEMpKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICdGJzoNCi0JCSAgTW92ZVdpbmRvdyhoV25kLCAxMCwgMTAsIDUwMCwgNjAwLCBUUlVFKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICdHJzoNCi0JCSAgTW92ZVdpbmRvdyhoV25kQnV0LCAyMCwgMjAsIDEwMCwgMjAsIFRSVUUpOw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgJ0gnOg0KLQkJICBXaW5IZWxwKGhXbmRNYWluLCAidG90by5obHAiLCBIRUxQX0lOREVYLCAwTCk7DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnSic6DQotCQkgIFdpbkV4ZWMoIi9EOi93aW5lL3dpZGdldC5leGUgYXJnMSBhcmcyIGFyZzMgYXJnNCBhcmc1IGFyZzYiLCBTV19OT1JNQUwpOw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgJ0snOg0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgJ1EnOg0KLQkJICBoV25kQ2hrID0gQ3JlYXRlV2luZG93KCJCVVRUT04iLCAiQ2hlY2tCb3ggIzEiLA0KLSAgICAgICAgICAgICAgICAgICAgV1NfQ0hJTEQgfCBXU19DTElQU0lCTElOR1MgfCBXU19WSVNJQkxFIHwgQlNfQ0hFQ0tCT1gsDQotCQkJCQkJICAzMCwgMzAwLCAxMjAsIDIwLCBoV25kTWFpbiwgMTAyMCwgaEluc3QsIE5VTEwpOw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgJ1cnOg0KLQkJICB3UmV0ID0gU2VuZE1lc3NhZ2UoaFduZENoayAsIEJNX0dFVENIRUNLLCAwLCAwTCk7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRDaGsgLCBCTV9TRVRDSEVDSywgd1JldCwgMEwpOw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgJ0UnOg0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgJ1InOg0KLQkJICBoV25kUmFkaW8gPSBDcmVhdGVXaW5kb3coIkJVVFRPTiIsICJSYWRpb0J1dCAjMSIsDQotICAgICAgICAgICAgICAgICAgICBXU19DSElMRCB8IFdTX0NMSVBTSUJMSU5HUyB8IFdTX1ZJU0lCTEUgfCBCU19SQURJT0JVVFRPTiwNCi0JCQkJCQkgIDIzMCwgMTIwLCAxMjAsIDIwLCBoV25kTWFpbiwgMTAwMywgaEluc3QsIE5VTEwpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kUmFkaW8sIEJNX1NFVENIRUNLLCBUUlVFLCAwTCk7DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnVCc6DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkxpc3RCb3ggU2luZ2xlIGl0ZW0iKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICdZJzoNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiTGlzdEJveCBpdGVtICMyIik7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkxpc3RCb3ggaXRlbSAjMyIpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJMaXN0Qm94IGl0ZW0gIzQiKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiTGlzdEJveCBpdGVtICM1Iik7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkxpc3RCb3ggaXRlbSAjNiIpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfU0VUQ1VSU0VMLCAzLCAwTCk7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9JTlNFUlRTVFJJTkcsIDUsIChMUEFSQU0pIkl0ZW0gYmV0d2VlbiA1ICYgNiIpOw0KLQkJICB3UmV0ID0gU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0ZJTkRTVFJJTkcsIC0xLCAoTFBBUkFNKSJJdGVtIGJldHdlZW4gNSAmIDYiKTsNCi0JCSAgc3ByaW50ZihDLCAiTEJfRklORFNUUklORyByZXR1cm5lZCAjJXUgICAiLCB3UmV0KTsNCi0JCSAgVGV4dE91dChoRENNYWluLCAyNSwgMzAwLCBDLCBzdHJsZW4oQykpOw0KLQkJICB3UmV0ID0gU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0dFVENVUlNFTCwgMCwgMEwpOw0KLQkJICBzcHJpbnRmKEMsICJMQl9HRVRDVVJTRUwgcmV0dXJuZWQgIyV1ICAgIiwgd1JldCk7DQotCQkgIFRleHRPdXQoaERDTWFpbiwgMjUsIDMyMCwgQywgc3RybGVuKEMpKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICdVJzoNCi0JCSAgd1JldCA9IFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9HRVRDVVJTRUwsIDAsIDBMKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0RFTEVURVNUUklORywgd1JldCwgMEwpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfU0VUQ1VSU0VMLCB3UmV0LCAwTCk7DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnSSc6DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94LCBMQl9SRVNFVENPTlRFTlQsIDAsIDBMKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICBjYXNlICdPJzoNCi0JCSAgQzJbMF0gPSAnXDAnOw0KLQkJICB3UmV0ID0gU2VuZE1lc3NhZ2UoaFduZExCb3gsIExCX0dFVENVUlNFTCwgMCwgMEwpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfR0VUVEVYVCwgd1JldCwgKERXT1JEKUMyKTsNCi0JCSAgc3ByaW50ZihDLCAiTEJfR0VUVEVYVCAjJWQgcmV0dXJuZWQgJyVzJyAgICIsIHdSZXQsIEMyKTsNCi0JCSAgVGV4dE91dChoRENNYWluLCAyNSwgMzIwLCBDLCBzdHJsZW4oQykpOw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgJ1AnOg0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveCwgTEJfRElSLCAwLCAoRFdPUkQpIiouKiIpOw0KLSAgICAgICAgYnJlYWs7DQotICAgIGNhc2UgJ1onOg0KLQkJICBTaG93V2luZG93KGhXbmRTY3JvbCwgU1dfSElERSk7DQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSAnWCc6DQotCQkgIFNob3dXaW5kb3coaFduZFNjcm9sLCBTV19TSE9XKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgY2FzZSAnVic6DQotCQkgIE1vdmVXaW5kb3coaFduZFNjcm9sLCAxMjAsIDE1MCwgMTUsIDYwLCBUUlVFKTsNCi0gICAgICAgIGJyZWFrOw0KLSAgICAgY2FzZSAnQic6DQotCQkgIGhXbmRDQm94ID0gQ3JlYXRlV2luZG93KCJDT01CT0JPWCIsICJDb21ibyAjMiIsDQotCQkJCQlXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSIHwgQ0JTX0RST1BET1dOLA0KLQkJCQkJMzAsIDI3MCwgMTUwLCAxMDAsIGhXbmRNYWluLCAxMDYxLCBoSW5zdCwgTlVMTCk7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRDQm94LCBDQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkNvbWJvQm94IGl0ZW0gIzEiKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZENCb3gsIENCX0FERFNUUklORywgMCwgKExQQVJBTSkiQ29tYm9Cb3ggaXRlbSAjMiIpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kQ0JveCwgQ0JfRElSLCAwLCAoRFdPUkQpIiouKiIpOw0KLSAgICAgICAgYnJlYWs7DQotICAgICBjYXNlICdOJzoNCi0JCSAgaFduZExCb3gyID0gQ3JlYXRlV2luZG93KCJMSVNUQk9YIiwgIiIsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8DQotCQkJCQlXU19CT1JERVIgfCBXU19WU0NST0xMIHwgTEJTX09XTkVSRFJBV1ZBUklBQkxFIHwgTEJTX05PVElGWSwNCi0vLwkJCQkJV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IExCU19PV05FUkRSQVdWQVJJQUJMRSB8IExCU19IQVNTVFJJTkdTIHwgTEJTX05PVElGWSwNCi0JCQkJCTMwLCAzMDAsIDE1MCwgNjAsIGhXbmRNYWluLCAxMDYyLCBoSW5zdCwgTlVMTCk7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94MiwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJEUkFXRklYRUQgIzEiKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gyLCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkRSQVdGSVhFRCAjMiIpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveDIsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiRFJBV0ZJWEVEICMzIik7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94MiwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJEUkFXRklYRUQgIzQiKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gyLCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkRSQVdGSVhFRCAjNSIpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveDIsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiRFJBV0ZJWEVEICM2Iik7DQotICAgICAgICBicmVhazsNCi0gICAgIGNhc2UgJ00nOg0KLQkJICBoV25kTEJveDMgPSBDcmVhdGVXaW5kb3coIkxJU1RCT1giLCAiIiwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwNCi0JCQkJCVdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBMQlNfT1dORVJEUkFXVkFSSUFCTEUgfCBMQlNfTk9USUZZLA0KLS8vCQkJCQlXU19CT1JERVIgfCBXU19WU0NST0xMIHwgTEJTX09XTkVSRFJBV1ZBUklBQkxFIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfTk9USUZZLA0KLQkJCQkJMjMwLCAzMDAsIDE1MCwgNjAsIGhXbmRNYWluLCAxMDYzLCBoSW5zdCwgTlVMTCk7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94MywgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJEUkFXVkFSSUFCTEUgIzEiKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gzLCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkRSQVdWQVJJQUJMRSAjMiIpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveDMsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiRFJBV1ZBUklBQkxFICMzIik7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94MywgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJEUkFXVkFSSUFCTEUgIzQiKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gzLCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkRSQVdWQVJJQUJMRSAjNSIpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveDMsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiRFJBV1ZBUklBQkxFICM2Iik7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94MywgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJEUkFXVkFSSUFCTEUgIzciKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gzLCBMQl9TRVRJVEVNSEVJR0hULCAxLCAxMEwpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveDMsIExCX1NFVElURU1IRUlHSFQsIDIsIDIwTCk7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94MywgTEJfU0VUSVRFTUhFSUdIVCwgMywgMzBMKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3gzLCBMQl9TRVRJVEVNSEVJR0hULCA0LCA0MEwpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveDMsIExCX1NFVElURU1IRUlHSFQsIDUsIDUwTCk7DQotICAgICAgICBicmVhazsNCi0gICAgIGNhc2UgJ0wnOg0KLQkJICBoQml0TWFwID0gTG9hZEJpdG1hcChoSW5zdCwgTUFLRUlOVFJFU09VUkNFKDMzMzMpKTsNCi0JCSAgR2V0T2JqZWN0KGhCaXRNYXAsIHNpemVvZihCSVRNQVApLCAoTFBTVFIpJkJpdE1hcCk7DQotCQkgIGhXbmRMQm94NCA9IENyZWF0ZVdpbmRvdygiTElTVEJPWCIsICIiLCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfA0KLQkJCQkJV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IExCU19PV05FUkRSQVdWQVJJQUJMRSB8IExCU19IQVNTVFJJTkdTIHwgTEJTX05PVElGWSwNCi0JCQkJCTIzMCwgMzgwLCAxNTAsIDYwLCBoV25kTWFpbiwgMTA2NCwgaEluc3QsIE5VTEwpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveDQsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiRFJBV1ZBUklBQkxFICMxIik7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94NCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJEUkFXVkFSSUFCTEUgIzIiKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3g0LCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkRSQVdWQVJJQUJMRSAjMyIpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveDQsIExCX0FERFNUUklORywgMCwgKExQQVJBTSkiRFJBV1ZBUklBQkxFICM0Iik7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94NCwgTEJfQUREU1RSSU5HLCAwLCAoTFBBUkFNKSJEUkFXVkFSSUFCTEUgIzUiKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3g0LCBMQl9BRERTVFJJTkcsIDAsIChMUEFSQU0pIkRSQVdWQVJJQUJMRSAjNiIpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveDQsIExCX1NFVElURU1IRUlHSFQsIDEsIDEwTCk7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94NCwgTEJfU0VUSVRFTUhFSUdIVCwgMiwgMjBMKTsNCi0JCSAgU2VuZE1lc3NhZ2UoaFduZExCb3g0LCBMQl9TRVRJVEVNSEVJR0hULCAzLCAzMEwpOw0KLQkJICBTZW5kTWVzc2FnZShoV25kTEJveDQsIExCX1NFVElURU1IRUlHSFQsIDQsIDQwTCk7DQotCQkgIFNlbmRNZXNzYWdlKGhXbmRMQm94NCwgTEJfU0VUSVRFTUhFSUdIVCwgNSwgNTBMKTsNCi0gICAgICAgIGJyZWFrOw0KLQ0KLSAgICBjYXNlIFZLX0YxMDogICAgICAgICAgICAgLyogJ0YxMCcgRlVOQ1RJT04gS0VZICovDQotICAgICAgICBicmVhazsNCi0gICAgY2FzZSBWS19GMTE6ICAgICAgICAgICAgIC8qICdGMTEnIEZVTkNUSU9OIEtFWSAqLw0KLSAgICAgICAgYnJlYWs7DQotICAgIH0NCi1yZXR1cm4oVFJVRSk7DQotfQ0KLQ0KLQ0KLQ0KLXZvaWQgRG9QYWludChIV05EIGhXbmQpDQotew0KLUhEQyAgICAgICAgIGhEQzsNCi1SRUNUICAgICAgICByZWN0Ow0KLVBBSU5UU1RSVUNUIHBzOw0KLWNoYXIgICBDWzgwXTsNCi1HZXRDbGllbnRSZWN0KGhXbmQsICZyZWN0KTsNCi1oREMgPSBCZWdpblBhaW50KGhXbmQsICZwcyk7DQotRmlsbFJlY3QoaERDLCAmcmVjdCwgR2V0U3RvY2tPYmplY3QoR1JBWV9CUlVTSCkpOw0KLUluZmxhdGVSZWN0KCZyZWN0LCAtMywgLTMpOw0KLUZyYW1lUmVjdChoREMsICZyZWN0LCBHZXRTdG9ja09iamVjdChCTEFDS19CUlVTSCkpOw0KLUluZmxhdGVSZWN0KCZyZWN0LCAtMTAsIC0xMCk7DQotRmlsbFJlY3QoaERDLCAmcmVjdCwgR2V0U3RvY2tPYmplY3QoV0hJVEVfQlJVU0gpKTsNCi1zcHJpbnRmKEMsICJXaW5lIFRlc3RpbmcgISEhIik7DQotVGV4dE91dChoREMsIDI1LCAyNSwgQywgc3RybGVuKEMpKTsNCi1SZWxlYXNlREMoaFduZCxoREMpOw0KLUVuZFBhaW50KGhXbmQsJnBzKTsNCi19DQotDQotDQotSEJSVVNIIENyZWF0ZUxUR1JBWUJydXNoKCkNCi17DQotcmV0dXJuKENyZWF0ZVNPTElEQnJ1c2goMHgwMEMwQzBDMCkpOw0KLX0NCi0NCi0NCi0NCi1IQlJVU0ggQ3JlYXRlU09MSURCcnVzaChDT0xPUlJFRiBDb2xvcikNCi17DQotTE9HQlJVU0ggbG9nR1JBWUJydXNoOw0KLWxvZ0dSQVlCcnVzaC5sYlN0eWxlID0gQlNfU09MSUQ7DQotbG9nR1JBWUJydXNoLmxiQ29sb3IgPSBDb2xvcjsNCi1sb2dHUkFZQnJ1c2gubGJIYXRjaCA9IE5VTEw7DQotcmV0dXJuKENyZWF0ZUJydXNoSW5kaXJlY3QoJmxvZ0dSQVlCcnVzaCkpOw0KLX0NCi0NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0NCi12b2lkIFNldFZlcnRTY3JvbGwoaW50IGhEbGcsIGludCBoV25kU0NST0xMLCBpbnQgVkFMLCBpbnQgTUlOLCBpbnQgTUFYKQ0KLXsNCi1jaGFyICBDWzEyXTsNCi1TZXRTY3JvbGxSYW5nZShoV25kU0NST0xMLCBTQl9DVEwsIC1NQVgsIC1NSU4sIEZBTFNFKTsNCi1TZXRTY3JvbGxQb3MoaFduZFNDUk9MTCwgU0JfQ1RMLCAtVkFMLCBUUlVFKTsNCi1pdG9hKFZBTCwgQywgMTApOw0KLS8vU2V0RGxnSXRlbVRleHQoaERsZywgKElERFRYVDEgKyBHZXREbGdDdHJsSUQoaFduZFNDUk9MTCkgLSBJRERTQ1JPTEwxKSwgQyk7DQotfQ0KLQ0KLQ0KLQ0KLXZvaWQgU2V0SG9yelNjcm9sbChpbnQgaERsZywgaW50IGhXbmRTQ1JPTEwsIGludCBWQUwsIGludCBNSU4sIGludCBNQVgpDQotew0KLWNoYXIgIENbMTJdOw0KLVNldFNjcm9sbFJhbmdlKGhXbmRTQ1JPTEwsIFNCX0NUTCwgTUFYLCBNSU4sIEZBTFNFKTsNCi1TZXRTY3JvbGxQb3MoaFduZFNDUk9MTCwgU0JfQ1RMLCBWQUwsIFRSVUUpOw0KLWl0b2EoVkFMLCBDLCAxMCk7DQotLy9TZXREbGdJdGVtVGV4dChoRGxnLCAoSUREVFhUMSArIEdldERsZ0N0cmxJRChoV25kU0NST0xMKSAtIElERFNDUk9MTDEpLCBDKTsNCi19DQotDQotDQotDQotdm9pZCBEb19EbGdfVmVydFNjcm9sbChIV05EIGhEbGcsIFdPUkQgd1BhcmFtLCBEV09SRCBsUGFyYW0sIGludCAqViwgaW50IE1JTiwgaW50IE1BWCkNCi17DQotY2hhciAgQ1sxMl07DQotaW50ICAgVkFMOw0KLWludCAgIFZBTDI7DQotaW50CVN0ZXAgPSAxMDA7DQotaWYgKE1BWCA8IDEwMDApCVN0ZXAgPSAxMDsNCi1pZiAoTUFYIDwgMTAwKQkJU3RlcCA9IE1BWCAvIDEwOw0KLVZBTCA9ICooVik7DQotVkFMMiA9IFZBTDsNCi1zd2l0Y2ggKHdQYXJhbSkNCi0gICAgew0KLSAgICBjYXNlIFNCX0xJTkVVUDoNCi0JCQlWQUwrKzsNCi0JCQlicmVhazsNCi0gICAgY2FzZSBTQl9MSU5FRE9XTjoNCi0JCQlWQUwtLTsNCi0JCQlicmVhazsNCi0gICAgY2FzZSBTQl9QQUdFVVA6DQotCQkJVkFMICs9IFN0ZXA7DQotCQkJYnJlYWs7DQotICAgIGNhc2UgU0JfUEFHRURPV046DQotCQkJVkFMIC09IFN0ZXA7DQotCQkJYnJlYWs7DQotICAgIGNhc2UgU0JfVEhVTUJUUkFDSzoNCi0gICAgY2FzZSBTQl9USFVNQlBPU0lUSU9OOg0KLQkJICAgVkFMID0gLShMT1dPUkQobFBhcmFtKSk7DQotCQkJYnJlYWs7DQotCX0NCi1pZiAoVkFMID4gTUFYKQkJVkFMID0gTUFYOw0KLWlmIChWQUwgPCBNSU4pCQlWQUwgPSBNSU47DQotaWYgKFZBTCAhPSBWQUwyKQ0KLSAgICB7DQotICAgIFNldFNjcm9sbFBvcyhISVdPUkQobFBhcmFtKSwgU0JfQ1RMLCAtVkFMLCBUUlVFKTsNCi0gICAgbHRvYShWQUwsIEMsIDEwKTsNCi0vLyAgICBTZXREbGdJdGVtVGV4dChoRGxnLCAoSUREVFhUMSArIEdldERsZ0N0cmxJRChISVdPUkQobFBhcmFtKSkgLSBJRERTQ1JPTEwxKSwgQyk7DQotICAgIH0NCi0qKFYpID0gVkFMOw0KLX0NCi0NCi0NCi12b2lkIERvX0RsZ19Ib3J6U2Nyb2xsKEhXTkQgaERsZywgV09SRCB3UGFyYW0sIERXT1JEIGxQYXJhbSwgaW50ICpWLCBpbnQgTUlOLCBpbnQgTUFYKQ0KLXsNCi1jaGFyICBDWzEyXTsNCi1pbnQgICBWQUw7DQotaW50ICAgVkFMMjsNCi1pbnQJU3RlcCA9IDEwMDsNCi1pZiAoTUFYIDwgMTAwMCkJU3RlcCA9IDEwOw0KLWlmIChNQVggPCAxMDApCQlTdGVwID0gTUFYIC8gMTA7DQotVkFMID0gKihWKTsNCi1WQUwyID0gVkFMOw0KLXN3aXRjaCAod1BhcmFtKQ0KLSAgICB7DQotICAgIGNhc2UgU0JfTElORVVQOg0KLQkJCVZBTC0tOw0KLQkJCWJyZWFrOw0KLSAgICBjYXNlIFNCX0xJTkVET1dOOg0KLQkJCVZBTCsrOw0KLQkJCWJyZWFrOw0KLSAgICBjYXNlIFNCX1BBR0VVUDoNCi0JCQlWQUwgLT0gU3RlcDsNCi0JCQlicmVhazsNCi0gICAgY2FzZSBTQl9QQUdFRE9XTjoNCi0JCQlWQUwgKz0gU3RlcDsNCi0JCQlicmVhazsNCi0gICAgY2FzZSBTQl9USFVNQlRSQUNLOg0KLSAgICBjYXNlIFNCX1RIVU1CUE9TSVRJT046DQotCQkgICBWQUwgPSAoTE9XT1JEKGxQYXJhbSkpOw0KLQkJCWJyZWFrOw0KLQl9DQotaWYgKFZBTCA+IE1BWCkJCVZBTCA9IE1BWDsNCi1pZiAoVkFMIDwgTUlOKQkJVkFMID0gTUlOOw0KLWlmIChWQUwgIT0gVkFMMikNCi0gICAgew0KLSAgICBTZXRTY3JvbGxQb3MoSElXT1JEKGxQYXJhbSksIFNCX0NUTCwgVkFMLCBUUlVFKTsNCi0gICAgbHRvYShWQUwsIEMsIDEwKTsNCi0vLyAgICBTZXREbGdJdGVtVGV4dChoRGxnLCAoSUREVFhUMSArIEdldERsZ0N0cmxJRChISVdPUkQobFBhcmFtKSkgLSBJRERTQ1JPTEwxKSwgQyk7DQotICAgIH0NCi0qKFYpID0gVkFMOw0KLX0NCi0NCi0NCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi0NCi0aClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9tYXJ0aW5fc2hpcDQvd2lkZ2V0LmV4ZSBiL3Rlc3QvbWFydGluX3NoaXA0L3dpZGdldC5leGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkxZWNkMDAuLjAwMDAwMDAKLS0tIGEvdGVzdC9tYXJ0aW5fc2hpcDQvd2lkZ2V0LmV4ZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Qvd2lkZ2V0LmV4ZSBiL3Rlc3Qvd2lkZ2V0LmV4ZQppbmRleCA4OTgzN2Q1Li42YWZiZjI0IDEwMDc1NQotLS0gYS90ZXN0L3dpZGdldC5leGUKKysrIGIvdGVzdC93aWRnZXQuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3dpbmRvd3MvTWFrZWZpbGUgYi93aW5kb3dzL01ha2VmaWxlCmluZGV4IDgxMmJkMzQuLjBjNWQzNGEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvTWFrZWZpbGUKKysrIGIvd2luZG93cy9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKIAogT0JKUz1jbGFzcy5vIGRjLm8gZGNlLm8gZXZlbnQubyBtZXNzYWdlLm8gd2luLm8gdGltZXIubyBncmFwaGljcy5vIFwKICAgICAJY2xpcHBpbmcubyBtYXBwaW5nLm8gcGFpbnRpbmcubyBrZXlib2FyZC5vIHV0aWxpdHkubyBzeXNjb2xvci5vIFwKLQlkZWZ3bmQubyBkZWZkbGcubyBkaWFsb2cubyBmb2N1cy5vCisJZGVmd25kLm8gZGVmZGxnLm8gZGlhbG9nLm8gZm9jdXMubyBzY3JvbGwubwogCiBkZWZhdWx0OiB3aW5kb3dzLm8KIApkaWZmIC0tZ2l0IGEvd2luZG93cy9kaWFsb2cuYyBiL3dpbmRvd3MvZGlhbG9nLmMKaW5kZXggZTYwYjYyZC4uMTA4Yzk2NCAxMDA2NDQKLS0tIGEvd2luZG93cy9kaWFsb2cuYworKysgYi93aW5kb3dzL2RpYWxvZy5jCkBAIC02LDEwICs2LDkgQEAKIAogc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0ICBBbGV4YW5kcmUgSnVsbGlhcmQsIDE5OTMiOwogCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiZGlhbG9nLmgiCisjaW5jbHVkZSAicHJvdG90eXBlcy5oIgogI2luY2x1ZGUgIndpbi5oIgogCiAKQEAgLTI5LDcgKzI4LDcgQEAKICAgICAKICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgZGlhbG9nIGJhc2UgdW5pdHMgKi8KIAotICAgIGlmICghKGhkYyA9IEdldERDKCAwICkpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCEoaGRjID0gR2V0REMoR2V0RGVza3RvcFdpbmRvdygpKSkpIHJldHVybiBGQUxTRTsKICAgICBHZXRUZXh0TWV0cmljcyggaGRjLCAmdG0gKTsKICAgICBSZWxlYXNlREMoIDAsIGhkYyApOwogICAgIHhCYXNlVW5pdCA9IHRtLnRtQXZlQ2hhcldpZHRoOwpAQCAtNzksMTUgKzc4LDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBESUFMT0dfUGFyc2VUZW1wbGF0ZQogICoKLSAqIEZpbGwgYSBETEdURU1QTEFURSBzdHJ1Y3R1cmUgZnJvbSB0aGUgZGlhbG9nIHRlbXBsYXRlLgorICogRmlsbCBhIERMR1RFTVBMQVRFIHN0cnVjdHVyZSBmcm9tIHRoZSBkaWFsb2cgdGVtcGxhdGUsIGFuZCByZXR1cm4KKyAqIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgY29udHJvbC4KICAqLwotc3RhdGljIHZvaWQgRElBTE9HX1BhcnNlVGVtcGxhdGUoIExQQ1NUUiB0ZW1wbGF0ZSwgRExHVEVNUExBVEUgKiByZXN1bHQgKQorc3RhdGljIERMR0NPTlRST0xIRUFERVIgKiBESUFMT0dfUGFyc2VUZW1wbGF0ZSggTFBDU1RSIHRlbXBsYXRlLAorCQkJCQkgICAgICAgIERMR1RFTVBMQVRFICogcmVzdWx0ICkKIHsKLSAgICBpbnQgaTsKICAgICB1bnNpZ25lZCBjaGFyICogcCA9ICh1bnNpZ25lZCBjaGFyICopdGVtcGxhdGU7CiAgCiAgICAgcmVzdWx0LT5oZWFkZXIgPSAoRExHVEVNUExBVEVIRUFERVIgKilwOwogICAgIHAgKz0gMTM7CisKICAgICByZXN1bHQtPm1lbnVOYW1lID0gcDsKICAgICBpZiAoKnAgPT0gMHhmZikgcCArPSAzOwogICAgIGVsc2UgcCArPSBzdHJsZW4ocCkgKyAxOwpAQCAtMTA0LDE4ICsxMDUsOCBAQAogCXJlc3VsdC0+cG9pbnRTaXplID0gKihXT1JEICopcDsJcCArPSBzaXplb2YoV09SRCk7CiAJcmVzdWx0LT5mYWNlTmFtZSA9IHA7ICAgICAgICAgICBwICs9IHN0cmxlbihwKSArIDE7CiAgICAgfQotICAgIHJlc3VsdC0+Y29udHJvbHMgPSBOVUxMOwotICAgIGlmICghcmVzdWx0LT5oZWFkZXItPm5iSXRlbXMpIHJldHVybjsKLSAgICByZXN1bHQtPmNvbnRyb2xzID0gKERMR0NPTlRST0wgKikgbWFsbG9jKCByZXN1bHQtPmhlYWRlci0+bmJJdGVtcyAqIHNpemVvZihETEdDT05UUk9MKSApOwotICAgIGlmICghcmVzdWx0LT5jb250cm9scykgcmV0dXJuOwogCi0gICAgZm9yIChpID0gMDsgaSA8IHJlc3VsdC0+aGVhZGVyLT5uYkl0ZW1zOyBpKyspCi0gICAgewotCXJlc3VsdC0+Y29udHJvbHNbaV0uaGVhZGVyID0gKERMR0NPTlRST0xIRUFERVIgKilwOwotCXAgPSAoY2hhciAqKURJQUxPR19HZXRDb250cm9sKCByZXN1bHQtPmNvbnRyb2xzW2ldLmhlYWRlciwKLQkJCQkgICAgICAmcmVzdWx0LT5jb250cm9sc1tpXS5jbGFzcywKLQkJCQkgICAgICAmcmVzdWx0LT5jb250cm9sc1tpXS50ZXh0ICk7CQotICAgIH0KKyAgICByZXR1cm4gKERMR0NPTlRST0xIRUFERVIgKilwOwogfQogCiAKQEAgLTEyNSw5ICsxMTYsNiBAQAogI2lmZGVmIERFQlVHX0RJQUxPRwogc3RhdGljIHZvaWQgRElBTE9HX0Rpc3BsYXlUZW1wbGF0ZSggRExHVEVNUExBVEUgKiByZXN1bHQgKQogewotICAgIGludCBpOwotICAgIERMR0NPTlRST0wgKiBjdHJsID0gcmVzdWx0LT5jb250cm9sczsKLSAgICAKICAgICBwcmludGYoICJESUFMT0cgJWQsICVkLCAlZCwgJWRcbiIsIHJlc3VsdC0+aGVhZGVyLT54LCByZXN1bHQtPmhlYWRlci0+eSwKIAkgICAgcmVzdWx0LT5oZWFkZXItPmN4LCByZXN1bHQtPmhlYWRlci0+Y3kgKTsKICAgICBwcmludGYoICIgU1RZTEUgJTA4eFxuIiwgcmVzdWx0LT5oZWFkZXItPnN0eWxlICk7CkBAIC0xMzgsMTggKzEyNiw2IEBACiAgICAgZWxzZSBwcmludGYoICIgTUVOVSAnJXMnXG4iLCByZXN1bHQtPm1lbnVOYW1lICk7CiAgICAgaWYgKHJlc3VsdC0+aGVhZGVyLT5zdHlsZSAmIERTX1NFVEZPTlQpCiAJcHJpbnRmKCAiIEZPTlQgJWQsJyVzJ1xuIiwgcmVzdWx0LT5wb2ludFNpemUsIHJlc3VsdC0+ZmFjZU5hbWUgKTsKLQotICAgIHByaW50ZiggIiBCRUdJTlxuIiApOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHJlc3VsdC0+aGVhZGVyLT5uYkl0ZW1zOyBpKyssIGN0cmwrKykKLSAgICB7Ci0JcHJpbnRmKCAiICAgJXMgJyVzJyAlZCwgJWQsICVkLCAlZCwgJWQsICUwOHhcbiIsCi0JICAgICAgICBjdHJsLT5jbGFzcywgY3RybC0+dGV4dCwgY3RybC0+aGVhZGVyLT5pZCwKLQkgICAgICAgIGN0cmwtPmhlYWRlci0+eCwgY3RybC0+aGVhZGVyLT55LCBjdHJsLT5oZWFkZXItPmN4LAotCSAgICAgICAgY3RybC0+aGVhZGVyLT5jeSwgY3RybC0+aGVhZGVyLT5zdHlsZSApOwotICAgIH0KLSAgICAKLSAgICBwcmludGYoICIgRU5EXG4iICk7CiB9CiAjZW5kaWYgIC8qIERFQlVHX0RJQUxPRyAqLwogCkBAIC0xODcsNyArMTYzLDcgQEAKICAgICBlbHNlIGh3bmQgPSBDcmVhdGVEaWFsb2dJbmRpcmVjdFBhcmFtKGhJbnN0LCBkYXRhLCBvd25lciwgZGxnUHJvYywgcGFyYW0pOwogICAgIEZyZWVSZXNvdXJjZSggaG1lbSApOwogI2Vsc2UKLSAgICBobWVtID0gUlNDX0xvYWRSZXNvdXJjZSggaEluc3QsIGRsZ1RlbXBsYXRlLCAweDgwMDUsICZzaXplICk7CisgICAgaG1lbSA9IFJTQ19Mb2FkUmVzb3VyY2UoIGhJbnN0LCBkbGdUZW1wbGF0ZSwgTkVfUlNDVFlQRV9ESUFMT0csICZzaXplICk7CiAgICAgZGF0YSA9IChMUENTVFIpIEdsb2JhbExvY2soIGhtZW0gKTsKICAgICBod25kID0gQ3JlYXRlRGlhbG9nSW5kaXJlY3RQYXJhbSggaEluc3QsIGRhdGEsIG93bmVyLCBkbGdQcm9jLCBwYXJhbSApOwogICAgIEdsb2JhbEZyZWUoIGhtZW0gKTsKQEAgLTIxMiwzMSArMTg4LDM5IEBACiBIV05EIENyZWF0ZURpYWxvZ0luZGlyZWN0UGFyYW0oIEhJTlNUQU5DRSBoSW5zdCwgTFBDU1RSIGRsZ1RlbXBsYXRlLAogCQkJICAgICAgICBIV05EIG93bmVyLCBGQVJQUk9DIGRsZ1Byb2MsIExQQVJBTSBwYXJhbSApCiB7Ci0gICAgSE1FTlUgaE1lbnUgPSAwOworICAgIEhNRU5VIGhNZW51OwogICAgIEhGT05UIGhGb250ID0gMDsKICAgICBIV05EIGh3bmQ7CiAgICAgV05EICogd25kUHRyOworICAgIGludCBpOwogICAgIERMR1RFTVBMQVRFIHRlbXBsYXRlOworICAgIERMR0NPTlRST0xIRUFERVIgKiBoZWFkZXI7CiAgICAgRElBTE9HSU5GTyAqIGRsZ0luZm87CiAgICAgV09SRCB4VW5pdCA9IHhCYXNlVW5pdDsKICAgICBXT1JEIHlVbml0ID0geUJhc2VVbml0OwotICAgIAotICAgIGlmICghZGxnVGVtcGxhdGUpIHJldHVybiAwOwotICAgIERJQUxPR19QYXJzZVRlbXBsYXRlKCBkbGdUZW1wbGF0ZSwgJnRlbXBsYXRlICk7CiAKKyAgICAgIC8qIFBhcnNlIGRpYWxvZyB0ZW1wbGF0ZSAqLworCisgICAgaWYgKCFkbGdUZW1wbGF0ZSkgcmV0dXJuIDA7CisgICAgaGVhZGVyID0gRElBTE9HX1BhcnNlVGVtcGxhdGUoIGRsZ1RlbXBsYXRlLCAmdGVtcGxhdGUgKTsKICNpZmRlZiBERUJVR19ESUFMT0cKICAgICBESUFMT0dfRGlzcGxheVRlbXBsYXRlKCAmdGVtcGxhdGUgKTsKICNlbmRpZiAgICAKIAogICAgICAgLyogTG9hZCBtZW51ICovCiAKLSAgICBpZiAodGVtcGxhdGUubWVudU5hbWVbMF0pCisgICAgc3dpdGNoICh0ZW1wbGF0ZS5tZW51TmFtZVswXSkKICAgICB7Ci0JaWYgKHRlbXBsYXRlLm1lbnVOYW1lWzBdICE9IDB4ZmYpIAotCSAgICBoTWVudSA9IExvYWRNZW51KCBoSW5zdCwgdGVtcGxhdGUubWVudU5hbWUgKTsKLQllbHNlCi0JICAgIGhNZW51ID0gTG9hZE1lbnUoIGhJbnN0LCBNQUtFSU5UUkVTT1VSQ0UoIHRlbXBsYXRlLm1lbnVOYW1lWzFdICsKKyAgICAgIGNhc2UgMHgwMDoKKwkgIGhNZW51ID0gMDsKKwkgIGJyZWFrOworICAgICAgY2FzZSAweGZmOgorCSAgaE1lbnUgPSBMb2FkTWVudSggaEluc3QsIE1BS0VJTlRSRVNPVVJDRSggdGVtcGxhdGUubWVudU5hbWVbMV0gKwogCQkJCQkJICAgMjU2KnRlbXBsYXRlLm1lbnVOYW1lWzJdICkpOworCSAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorCSAgaE1lbnUgPSBMb2FkTWVudSggaEluc3QsIHRlbXBsYXRlLm1lbnVOYW1lICk7CisJICBicmVhazsKICAgICB9CiAKICAgICAgIC8qIENyZWF0ZSBjdXN0b20gZm9udCBpZiBuZWVkZWQgKi8KQEAgLTI1Miw3ICsyMzYsNyBAQAogCSAgICBIRk9OVCBvbGRGb250OwogCSAgICBIREMgaGRjOwogCi0JICAgIGhkYyA9IEdldERDKCAwICk7CisJICAgIGhkYyA9IEdldERDKEdldERlc2t0b3BXaW5kb3coKSk7CiAJICAgIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QoIGhkYywgaEZvbnQgKTsKIAkgICAgR2V0VGV4dE1ldHJpY3MoIGhkYywgJnRtICk7CiAJICAgIFNlbGVjdE9iamVjdCggaGRjLCBvbGRGb250ICk7CkBAIC0yNjEsMTEgKzI0NSwxMSBAQAogCSAgICB5VW5pdCA9IHRtLnRtSGVpZ2h0OwogCX0KICAgICB9Ci0KKyAgICAKICAgICAgIC8qIENyZWF0ZSBkaWFsb2cgbWFpbiB3aW5kb3cgKi8KIAogICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coIHRlbXBsYXRlLmNsYXNzTmFtZSwgdGVtcGxhdGUuY2FwdGlvbiwKLQkJCSB0ZW1wbGF0ZS5oZWFkZXItPnN0eWxlICYgfldTX1ZJU0lCTEUsCisJCQkgdGVtcGxhdGUuaGVhZGVyLT5zdHlsZSwKIAkJCSB0ZW1wbGF0ZS5oZWFkZXItPnggKiB4VW5pdCAvIDQsCiAJCQkgdGVtcGxhdGUuaGVhZGVyLT55ICogeVVuaXQgLyA4LAogCQkJIHRlbXBsYXRlLmhlYWRlci0+Y3ggKiB4VW5pdCAvIDQsCkBAIC0yNzYsMjcgKzI2MCw0MiBAQAogICAgIHsKIAlpZiAoaEZvbnQpIERlbGV0ZU9iamVjdCggaEZvbnQgKTsKIAlpZiAoaE1lbnUpIERlc3Ryb3lNZW51KCBoTWVudSApOwotCWlmICh0ZW1wbGF0ZS5jb250cm9scykgZnJlZSggdGVtcGxhdGUuY29udHJvbHMgKTsKIAlyZXR1cm4gMDsKICAgICB9CiAKICAgICAgIC8qIENyZWF0ZSBjb250cm9sIHdpbmRvd3MgKi8KIAotICAgIGlmIChod25kICYmIHRlbXBsYXRlLmhlYWRlci0+bmJJdGVtcykKKyNpZmRlZiBERUJVR19ESUFMT0cKKyAgICBwcmludGYoICIgQkVHSU5cbiIgKTsKKyNlbmRpZgkKKworICAgIGZvciAoaSA9IDA7IGkgPCB0ZW1wbGF0ZS5oZWFkZXItPm5iSXRlbXM7IGkrKykKICAgICB7Ci0JaW50IGk7Ci0JRExHQ09OVFJPTCAqIGN0cmwgPSB0ZW1wbGF0ZS5jb250cm9sczsKLQlmb3IgKGkgPSAwOyBpIDwgdGVtcGxhdGUuaGVhZGVyLT5uYkl0ZW1zOyBpKyssIGN0cmwrKykKLQl7Ci0JICAgIENyZWF0ZVdpbmRvd0V4KCBXU19FWF9OT1BBUkVOVE5PVElGWSwgCi0JCQkgICAgY3RybC0+Y2xhc3MsIGN0cmwtPnRleHQsIGN0cmwtPmhlYWRlci0+c3R5bGUsCi0JCQkgICAgY3RybC0+aGVhZGVyLT54ICogeFVuaXQgLyA0LAotCQkJICAgIGN0cmwtPmhlYWRlci0+eSAqIHlVbml0IC8gOCwKLQkJCSAgICBjdHJsLT5oZWFkZXItPmN4ICogeFVuaXQgLyA0LAotCQkJICAgIGN0cmwtPmhlYWRlci0+Y3kgKiB5VW5pdCAvIDgsCi0JCQkgICAgaHduZCwgY3RybC0+aGVhZGVyLT5pZCwgaEluc3QsIE5VTEwgKTsKLQl9Ci0gICAgfQorCURMR0NPTlRST0xIRUFERVIgKiBuZXh0X2hlYWRlcjsKKwlMUFNUUiBjbGFzcywgdGV4dDsKKwluZXh0X2hlYWRlciA9IERJQUxPR19HZXRDb250cm9sKCBoZWFkZXIsICZjbGFzcywgJnRleHQgKTsKKworI2lmZGVmIERFQlVHX0RJQUxPRworCXByaW50ZiggIiAgICVzICclcycgJWQsICVkLCAlZCwgJWQsICVkLCAlMDh4XG4iLAorCSAgICAgICAgY2xhc3MsIHRleHQsIGhlYWRlci0+aWQsIGhlYWRlci0+eCwgaGVhZGVyLT55LCBoZWFkZXItPmN4LAorCSAgICAgICAgaGVhZGVyLT5jeSwgaGVhZGVyLT5zdHlsZSApOworI2VuZGlmCisJaWYgKChzdHJjbXAoY2xhc3MsICJTVEFUSUMiKSA9PSAwKSAmICgoaGVhZGVyLT5zdHlsZSAmIFNTX0lDT04pID09IFNTX0lDT04pKSB7CisJICAgIGhlYWRlci0+Y3ggPSAzMjsKKwkgICAgaGVhZGVyLT5jeSA9IDMyOworCSAgICB9CisJaGVhZGVyLT5zdHlsZSB8PSBXU19DSElMRDsKKwlDcmVhdGVXaW5kb3dFeCggV1NfRVhfTk9QQVJFTlROT1RJRlksIAorCQkgICAgICAgIGNsYXNzLCB0ZXh0LCBoZWFkZXItPnN0eWxlLAorCQkgICAgICAgIGhlYWRlci0+eCAqIHhVbml0IC8gNCwgaGVhZGVyLT55ICogeVVuaXQgLyA4LAorCQkgICAgICAgIGhlYWRlci0+Y3ggKiB4VW5pdCAvIDQsIGhlYWRlci0+Y3kgKiB5VW5pdCAvIDgsCisJCSAgICAgICAgaHduZCwgaGVhZGVyLT5pZCwgaEluc3QsIE5VTEwgKTsKKwloZWFkZXIgPSBuZXh0X2hlYWRlcjsKKyAgICB9ICAgIAorCisjaWZkZWYgREVCVUdfRElBTE9HCisgICAgcHJpbnRmKCAiIEVORFxuIiApOworI2VuZGlmCQogICAgIAogICAgICAgLyogSW5pdGlhbGlzZSBkaWFsb2cgZXh0cmEgZGF0YSAqLwogCkBAIC0zMTgsMzUgKzMxNywyNCBAQAogICAgIGlmIChTZW5kTWVzc2FnZSggaHduZCwgV01fSU5JVERJQUxPRywgZGxnSW5mby0+aHduZEZvY3VzLCBwYXJhbSApKQogCVNldEZvY3VzKCBkbGdJbmZvLT5od25kRm9jdXMgKTsKIAotICAgICAgLyogRGlzcGxheSBkaWFsb2cgKi8KLQotICAgIGlmICh0ZW1wbGF0ZS5oZWFkZXItPnN0eWxlICYgV1NfVklTSUJMRSkgU2hvd1dpbmRvdyggaHduZCwgU1dfU0hPVyApOwotICAgIAotICAgIGlmICh0ZW1wbGF0ZS5jb250cm9scykgZnJlZSggdGVtcGxhdGUuY29udHJvbHMgKTsKICAgICByZXR1cm4gaHduZDsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBEaWFsb2dCb3ggICAoVVNFUi44NykKKyAqICAgICAgICAgICBESUFMT0dfRG9EaWFsb2dCb3gKICAqLwotaW50IERpYWxvZ0JveCggSElOU1RBTkNFIGhJbnN0LCBMUENTVFIgZGxnVGVtcGxhdGUsCi0JICAgICAgIEhXTkQgb3duZXIsIEZBUlBST0MgZGxnUHJvYyApCitzdGF0aWMgaW50IERJQUxPR19Eb0RpYWxvZ0JveCggSFdORCBod25kICkKIHsKLSAgICBIV05EIGh3bmQ7CiAgICAgV05EICogd25kUHRyOwogICAgIERJQUxPR0lORk8gKiBkbGdJbmZvOwogICAgIE1TRyBtc2c7CiAgICAgaW50IHJldHZhbDsKIAotI2lmZGVmIERFQlVHX0RJQUxPRwotICAgIHByaW50ZiggIkRpYWxvZ0JveDogJWQsJyVzJywlZCwlcFxuIiwgaEluc3QsIGRsZ1RlbXBsYXRlLCBvd25lciwgZGxnUHJvYyApOwotI2VuZGlmCi0KLSAgICBod25kID0gQ3JlYXRlRGlhbG9nKCBoSW5zdCwgZGxnVGVtcGxhdGUsIG93bmVyLCBkbGdQcm9jICk7Ci0gICAgaWYgKCFod25kKSByZXR1cm4gLTE7Ci0gICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIC0xOwogICAgIGRsZ0luZm8gPSAoRElBTE9HSU5GTyAqKXduZFB0ci0+d0V4dHJhOworICAgIFNob3dXaW5kb3coIGh3bmQsIFNXX1NIT1cgKTsKKwogICAgIHdoaWxlIChHZXRNZXNzYWdlICgmbXNnLCAwLCAwLCAwKSkKICAgICB7CiAJaWYgKCFJc0RpYWxvZ01lc3NhZ2UoIGh3bmQsICZtc2cpKQpAQCAtMzYzLDYgKzM1MSw2MSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERpYWxvZ0JveCAgIChVU0VSLjg3KQorICovCitpbnQgRGlhbG9nQm94KCBISU5TVEFOQ0UgaEluc3QsIExQQ1NUUiBkbGdUZW1wbGF0ZSwKKwkgICAgICAgSFdORCBvd25lciwgRkFSUFJPQyBkbGdQcm9jICkKK3sKKyAgICByZXR1cm4gRGlhbG9nQm94UGFyYW0oIGhJbnN0LCBkbGdUZW1wbGF0ZSwgb3duZXIsIGRsZ1Byb2MsIDAgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBEaWFsb2dCb3hQYXJhbSAgIChVU0VSLjIzOSkKKyAqLworaW50IERpYWxvZ0JveFBhcmFtKCBISU5TVEFOQ0UgaEluc3QsIExQQ1NUUiBkbGdUZW1wbGF0ZSwKKwkJICAgIEhXTkQgb3duZXIsIEZBUlBST0MgZGxnUHJvYywgTFBBUkFNIHBhcmFtICkKK3sKKyAgICBIV05EIGh3bmQ7CisgICAgCisjaWZkZWYgREVCVUdfRElBTE9HCisgICAgcHJpbnRmKCAiRGlhbG9nQm94UGFyYW06ICVkLCclcycsJWQsJXAsJWRcbiIsCisJICAgIGhJbnN0LCBkbGdUZW1wbGF0ZSwgb3duZXIsIGRsZ1Byb2MsIHBhcmFtICk7CisjZW5kaWYKKyAgICBod25kID0gQ3JlYXRlRGlhbG9nUGFyYW0oIGhJbnN0LCBkbGdUZW1wbGF0ZSwgb3duZXIsIGRsZ1Byb2MsIHBhcmFtICk7CisgICAgaWYgKGh3bmQpIHJldHVybiBESUFMT0dfRG9EaWFsb2dCb3goIGh3bmQgKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRGlhbG9nQm94SW5kaXJlY3QgICAoVVNFUi4yMTgpCisgKi8KK2ludCBEaWFsb2dCb3hJbmRpcmVjdCggSElOU1RBTkNFIGhJbnN0LCBIQU5ETEUgZGxnVGVtcGxhdGUsCisJCSAgICAgICBIV05EIG93bmVyLCBGQVJQUk9DIGRsZ1Byb2MgKQoreworICAgIHJldHVybiBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtKCBoSW5zdCwgZGxnVGVtcGxhdGUsIG93bmVyLCBkbGdQcm9jLCAwICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRGlhbG9nQm94SW5kaXJlY3RQYXJhbSAgIChVU0VSLjI0MCkKKyAqLworaW50IERpYWxvZ0JveEluZGlyZWN0UGFyYW0oIEhJTlNUQU5DRSBoSW5zdCwgSEFORExFIGRsZ1RlbXBsYXRlLAorCQkJICAgIEhXTkQgb3duZXIsIEZBUlBST0MgZGxnUHJvYywgTFBBUkFNIHBhcmFtICkKK3sKKyAgICBIV05EIGh3bmQ7CisgICAgTFBDU1RSIHB0cjsKKworICAgIGlmICghKHB0ciA9IEdsb2JhbExvY2soIGRsZ1RlbXBsYXRlICkpKSByZXR1cm4gLTE7CisgICAgaHduZCA9IENyZWF0ZURpYWxvZ0luZGlyZWN0UGFyYW0oIGhJbnN0LCBwdHIsIG93bmVyLCBkbGdQcm9jLCBwYXJhbSApOworICAgIEdsb2JhbFVubG9jayggZGxnVGVtcGxhdGUgKTsKKyAgICBpZiAoaHduZCkgcmV0dXJuIERJQUxPR19Eb0RpYWxvZ0JveCggaHduZCApOworICAgIHJldHVybiAtMTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBFbmREaWFsb2cgICAoVVNFUi44OCkKICAqLwogdm9pZCBFbmREaWFsb2coIEhXTkQgaHduZCwgc2hvcnQgcmV0dmFsICkKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZXZlbnQuYyBiL3dpbmRvd3MvZXZlbnQuYwppbmRleCBmOWM1ZTIxLi4zMTMwMTg5IDEwMDY0NAotLS0gYS93aW5kb3dzL2V2ZW50LmMKKysrIGIvd2luZG93cy9ldmVudC5jCkBAIC0xNiw4ICsxNiw3IEBACiAKIAogI2RlZmluZSBOQl9CVVRUT05TICAgICAgMyAgICAgLyogV2luZG93cyBjYW4gaGFuZGxlIDMgYnV0dG9ucyAqLwotI2RlZmluZSBEQkxDTElDS19USU1FICAgMzAwICAgLyogTWF4LiB0aW1lIGZvciBhIGRvdWJsZSBjbGljayAobWlsbGlzZWNvbmRzKSAqLwotCitzdGF0aWMgV09SRCBkYmxjbGlja190aW1lID0gMzAwOyAvKiBNYXguIHRpbWUgZm9yIGEgZG91YmxlIGNsaWNrIChtaWxsaXNlY29uZHMpICovCiAKICAgLyogRXZlbnQgaGFuZGxlcnMgKi8KIHN0YXRpYyB2b2lkIEVWRU5UX2V4cG9zZSgpOwpAQCAtMTkxLDcgKzE5MCw3IEBACiAgICAgeyAgLyogQ2hlY2sgaWYgZG91YmxlLWNsaWNrICovCiAJcHJldlRpbWUgPSBsYXN0Q2xpY2tUaW1lW2J1dHRvbk51bV07CiAJbGFzdENsaWNrVGltZVtidXR0b25OdW1dID0gZXZlbnQtPnRpbWU7Ci0JaWYgKGV2ZW50LT50aW1lIC0gcHJldlRpbWUgPCBEQkxDTElDS19USU1FKQorCWlmIChldmVudC0+dGltZSAtIHByZXZUaW1lIDwgZGJsY2xpY2tfdGltZSkKIAl7CiAJICAgIFdORCAqIHduZFB0cjsKIAkgICAgQ0xBU1MgKiBjbGFzc1B0cjsKQEAgLTMyOSwzICszMjgsMjQgQEAKIAogICAgIGNhcHR1cmVXbmQgPSAwOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCVNldERvdWJsZUNsaWNrVGltZSAgKFVTRVIuMjApCisgKi8KK3ZvaWQgU2V0RG91YmxlQ2xpY2tUaW1lIChXT1JEIGludGVydmFsKQoreworCWlmIChpbnRlcnZhbCA9PSAwKQorCQlkYmxjbGlja190aW1lID0gNTAwOworCWVsc2UKKwkJZGJsY2xpY2tfdGltZSA9IGludGVydmFsOworfQkJCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJR2V0RG91YmxlQ2xpY2tUaW1lICAoVVNFUi4yMSkKKyAqLworV09SRCBHZXREb3VibGVDbGlja1RpbWUgKCkKK3sKKwlyZXR1cm4gKChXT1JEKWRibGNsaWNrX3RpbWUpOworfQkJCisKKwpkaWZmIC0tZ2l0IGEvd2luZG93cy9zY3JvbGwuYyBiL3dpbmRvd3Mvc2Nyb2xsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkNDNmZAotLS0gL2Rldi9udWxsCisrKyBiL3dpbmRvd3Mvc2Nyb2xsLmMKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBTY3JvbGwgd2luZG93cyBhbmQgRENzCisgKgorICogQ29weXJpZ2h0ICBEYXZpZCBXLiBNZXRjYWxmZSwgMTk5MworICoKKyAqLworCitzdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgIERhdmlkIFcuIE1ldGNhbGZlLCAxOTkzIjsKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJnZGkuaCIKKworc3RhdGljIGludCBSZ25UeXBlOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBTY3JvbGxXaW5kb3cgICAgICAgICAoVVNFUi42MSkKKyAqLworCit2b2lkIFNjcm9sbFdpbmRvdyhIV05EIGh3bmQsIHNob3J0IGR4LCBzaG9ydCBkeSwgTFBSRUNUIHJlY3QsIExQUkVDVCBjbGlwUmVjdCkKK3sKKyAgICBIREMgaGRjOworICAgIEhSR04gaHJnblVwZGF0ZTsKKyAgICBSRUNUIHJjLCBjbGlwcmM7CisKKyNpZmRlZiBERUJVR19TQ1JPTEwKKyAgICBwcmludGYoIlNjcm9sbFdpbmRvdzogZHg9JWQsIGR5PSVkLCByZWN0PSVkLCVkLCVkLCVkXG4iLCBkeCwgZHksCisJICAgcmVjdC0+bGVmdCwgcmVjdC0+dG9wLCByZWN0LT5yaWdodCwgcmVjdC0+Ym90dG9tKTsKKyNlbmRpZgorCisgICAgaGRjID0gR2V0REMoaHduZCk7CisKKyAgICBpZiAocmVjdCA9PSBOVUxMKQorCUdldFdpbmRvd1JlY3QoaHduZCwgJnJjKTsKKyAgICBlbHNlCisJQ29weVJlY3QoJnJjLCByZWN0KTsKKyAgICBpZiAoY2xpcFJlY3QgPT0gTlVMTCkKKwlHZXRXaW5kb3dSZWN0KGh3bmQsICZjbGlwcmMpOworICAgIGVsc2UKKwlDb3B5UmVjdCgmY2xpcHJjLCBjbGlwUmVjdCk7CisKKyAgICBocmduVXBkYXRlID0gQ3JlYXRlUmVjdFJnbigwLCAwLCAwLCAwKTsKKyAgICBTY3JvbGxEQyhoZGMsIGR4LCBkeSwgJnJjLCAmY2xpcHJjLCBocmduVXBkYXRlLCBOVUxMKTsKKyAgICBJbnZhbGlkYXRlUmduKGh3bmQsIGhyZ25VcGRhdGUsIFRSVUUpOworICAgIFJlbGVhc2VEQyhod25kLCBoZGMpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBTY3JvbGxEQyAgICAgICAgIChVU0VSLjIyMSkKKyAqLworCitCT09MIFNjcm9sbERDKEhEQyBoZGMsIHNob3J0IGR4LCBzaG9ydCBkeSwgTFBSRUNUIHJjLCBMUFJFQ1QgY2xpcHJjLAorCSAgICAgIEhSR04gaHJnblVwZGF0ZSwgTFBSRUNUIHJjVXBkYXRlKQoreworICAgIEhSR04gaHJnbkNsaXAsIGhyZ24xLCBocmduMjsKKyAgICBQT0lOVCBzcmMsIGRlc3Q7CisgICAgc2hvcnQgd2lkdGgsIGhlaWdodDsKKyAgICBEQyAqZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKGhkYywgRENfTUFHSUMpOworCisjaWZkZWYgREVCVUdfU0NST0xMCisgICAgcHJpbnRmKCJTY3JvbGxEQzogZHg9JWQsIGR5PSVkLCByYz0lZCwlZCwlZCwlZFxuIiwgZHgsIGR5LAorCSAgIHJjLT5sZWZ0LCByYy0+dG9wLCByYy0+cmlnaHQsIHJjLT5ib3R0b20pOworI2VuZGlmCisKKyAgICBpZiAocmMgPT0gTlVMTCkKKwlyZXR1cm47CisKKyAgICBpZiAoY2xpcHJjKQorICAgIHsKKwlocmduQ2xpcCA9IENyZWF0ZVJlY3RSZ25JbmRpcmVjdChjbGlwcmMpOworCVNlbGVjdENsaXBSZ24oaGRjLCBocmduQ2xpcCk7CisgICAgfQorCisgICAgaWYgKGR4ID4gMCkKKyAgICB7CisJc3JjLnggPSBYRFBUT0xQKGRjLCByYy0+bGVmdCk7CisJZGVzdC54ID0gWERQVE9MUChkYywgcmMtPmxlZnQgKyBhYnMoZHgpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlzcmMueCA9IFhEUFRPTFAoZGMsIHJjLT5sZWZ0ICsgYWJzKGR4KSk7CisJZGVzdC54ID0gWERQVE9MUChkYywgcmMtPmxlZnQpOworICAgIH0KKyAgICBpZiAoZHkgPiAwKQorICAgIHsKKwlzcmMueSA9IFlEUFRPTFAoZGMsIHJjLT50b3ApOworCWRlc3QueSA9IFlEUFRPTFAoZGMsIHJjLT50b3AgKyBhYnMoZHkpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKwlzcmMueSA9IFlEUFRPTFAoZGMsIHJjLT50b3AgKyBhYnMoZHkpKTsKKwlkZXN0LnkgPSBZRFBUT0xQKGRjLCByYy0+dG9wKTsKKyAgICB9CisKKyAgICB3aWR0aCA9IHJjLT5yaWdodCAtIHJjLT5sZWZ0IC0gYWJzKGR4KTsKKyAgICBoZWlnaHQgPSByYy0+Ym90dG9tIC0gcmMtPnRvcCAtIGFicyhkeSk7CisKKyAgICBpZiAoIUJpdEJsdChoZGMsIGRlc3QueCwgZGVzdC55LCB3aWR0aCwgaGVpZ2h0LCBoZGMsIHNyYy54LCBzcmMueSwgCisJCVNSQ0NPUFkpKQorCXJldHVybjsKKworICAgIGlmIChocmduVXBkYXRlKQorICAgIHsKKwlpZiAoZHggPiAwKQorCSAgICBocmduMSA9IENyZWF0ZVJlY3RSZ24ocmMtPmxlZnQsIHJjLT50b3AsIHJjLT5sZWZ0K2R4LCByYy0+Ym90dG9tKTsKKwllbHNlIGlmIChkeCA8IDApCisJICAgIGhyZ24xID0gQ3JlYXRlUmVjdFJnbihyYy0+cmlnaHQrZHgsIHJjLT50b3AsIHJjLT5yaWdodCwgCisJCQkJICByYy0+Ym90dG9tKTsKKwllbHNlCisJICAgIGhyZ24xID0gQ3JlYXRlUmVjdFJnbigwLCAwLCAwLCAwKTsKKworCWlmIChkeSA+IDApCisJICAgIGhyZ24yID0gQ3JlYXRlUmVjdFJnbihyYy0+bGVmdCwgcmMtPnRvcCwgcmMtPnJpZ2h0LCByYy0+dG9wK2R5KTsKKwllbHNlIGlmIChkeSA8IDApCisJICAgIGhyZ24yID0gQ3JlYXRlUmVjdFJnbihyYy0+bGVmdCwgcmMtPmJvdHRvbStkeSwgcmMtPnJpZ2h0LCAKKwkJCQkgIHJjLT5ib3R0b20pOworCWVsc2UKKwkgICAgaHJnbjIgPSBDcmVhdGVSZWN0UmduKDAsIDAsIDAsIDApOworCisJUmduVHlwZSA9IENvbWJpbmVSZ24oaHJnblVwZGF0ZSwgaHJnbjEsIGhyZ24yLCBSR05fT1IpOworICAgIH0KKworICAgIGlmIChyY1VwZGF0ZSkKKyAgICB7CisJU2VsZWN0Q2xpcFJnbihoZGMsIGhyZ25VcGRhdGUpOworCUdldENsaXBCb3goaGRjLCByY1VwZGF0ZSk7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICBTY3JvbGxXaW5kb3dFeCAgICAgICAoVVNFUi4zMTkpCisgKi8KKworaW50IFNjcm9sbFdpbmRvd0V4KEhXTkQgaHduZCwgc2hvcnQgZHgsIHNob3J0IGR5LCBMUFJFQ1QgcmVjdCwgTFBSRUNUIGNsaXBSZWN0LAorCQkgICBIUkdOIGhyZ25VcGRhdGUsIExQUkVDVCByY1VwZGF0ZSwgV09SRCBmbGFncykKK3sKKyAgICBIREMgaGRjOworICAgIFJFQ1QgcmMsIGNsaXByYzsKKworI2lmZGVmIERFQlVHX1NDUk9MTAorICAgIHByaW50ZigiU2Nyb2xsV2luZG93RXg6IGR4PSVkLCBkeT0lZCwgcmVjdD0lZCwlZCwlZCwlZFxuIiwgZHgsIGR5LAorCSAgIHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgcmVjdC0+cmlnaHQsIHJlY3QtPmJvdHRvbSk7CisjZW5kaWYKKworICAgIGhkYyA9IEdldERDKGh3bmQpOworCisgICAgaWYgKHJlY3QgPT0gTlVMTCkKKwlHZXRXaW5kb3dSZWN0KGh3bmQsICZyYyk7CisgICAgZWxzZQorCUNvcHlSZWN0KCZyYywgcmVjdCk7CisgICAgaWYgKGNsaXBSZWN0ID09IE5VTEwpCisJR2V0V2luZG93UmVjdChod25kLCAmY2xpcHJjKTsKKyAgICBlbHNlCisJQ29weVJlY3QoJmNsaXByYywgY2xpcFJlY3QpOworCisgICAgU2Nyb2xsREMoaGRjLCBkeCwgZHksICZyYywgJmNsaXByYywgaHJnblVwZGF0ZSwgcmNVcGRhdGUpOworCisgICAgaWYgKGZsYWdzIHwgU1dfSU5WQUxJREFURSkKKyAgICB7CisJSW52YWxpZGF0ZVJnbihod25kLCBocmduVXBkYXRlLCBGQUxTRSk7CisKKwlpZiAoZmxhZ3MgfCBTV19FUkFTRSkKKwkgICAgU2VuZE1lc3NhZ2UoaHduZCwgV01fRVJBU0VCS0dORCwgKFdPUkQpaGRjLCAoTE9ORylOVUxMKTsKKyAgICB9CisKKyAgICBSZWxlYXNlREMoaHduZCwgaGRjKTsKKyAgICByZXR1cm4gUmduVHlwZTsKK30KZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2luLmMgYi93aW5kb3dzL3dpbi5jCmluZGV4IDNlNTBhMzcuLmQ3ZmUzYTIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2luLmMKKysrIGIvd2luZG93cy93aW4uYwpAQCAtNTIsOSArNTIsMTEgQEAKICAgICBXTkQgKiB3bmRQdHI7CiAgICAgCiAgICAgaWYgKCFod25kKSBod25kID0gZmlyc3RXaW5kb3c7Ci0gICAgd2hpbGUgKGh3bmQpCisgICAgZm9yICggOyBod25kICE9IDA7IGh3bmQgPSB3bmRQdHItPmh3bmROZXh0ICkKICAgICB7CiAJaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybiAwOworCWlmICghd25kUHRyIHx8ICF3bmRQdHItPndpbldpZGdldCkgY29udGludWU7CisJaWYgKCFYdElzUmVhbGl6ZWQoIHduZFB0ci0+d2luV2lkZ2V0ICkpIGNvbnRpbnVlOwogCWlmICh3bmRQdHItPmhyZ25VcGRhdGUpIHJldHVybiBod25kOwogCWlmICh3bmRQdHItPmh3bmRDaGlsZCkKIAl7CkBAIC02Miw3ICs2NCw2IEBACiAJICAgIGlmICgoY2hpbGQgPSBXSU5fRmluZFdpblRvUmVwYWludCggd25kUHRyLT5od25kQ2hpbGQgKSkpCiAJCXJldHVybiBjaGlsZDsKIAl9Ci0JaHduZCA9IHduZFB0ci0+aHduZE5leHQ7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtMTIyLDggKzEyMyw4IEBACiAgICAgaWYgKHkgPT0gQ1dfVVNFREVGQVVMVCkgeSA9IDA7CiAgICAgaWYgKHdpZHRoID09IENXX1VTRURFRkFVTFQpIHdpZHRoID0gNjAwOwogICAgIGlmIChoZWlnaHQgPT0gQ1dfVVNFREVGQVVMVCkgaGVpZ2h0ID0gNDAwOwotICAgIGlmICghd2lkdGgpIHdpZHRoID0gMTsKLSAgICBpZiAoIWhlaWdodCkgaGVpZ2h0ID0gMTsKKyAgICBpZiAod2lkdGggPT0gMCkgd2lkdGggPSAxOworICAgIGlmIChoZWlnaHQgPT0gMCkgaGVpZ2h0ID0gMTsKIAogICAgICAgLyogRmluZCB0aGUgcGFyZW50IGFuZCBjbGFzcyAqLwogCkBAIC0xMzUsOSArMTM2LDEwIEBACiAgICAgfQogICAgIGVsc2UgaWYgKHN0eWxlICYgV1NfQ0hJTEQpIHJldHVybiAwOyAgLyogV1NfQ0hJTEQgbmVlZHMgYSBwYXJlbnQgKi8KIAotICAgIGlmICghKGNsYXNzID0gQ0xBU1NfRmluZENsYXNzQnlOYW1lKCBjbGFzc05hbWUsICZjbGFzc1B0ciApKSkKKyAgICBpZiAoIShjbGFzcyA9IENMQVNTX0ZpbmRDbGFzc0J5TmFtZSggY2xhc3NOYW1lLCAmY2xhc3NQdHIgKSkpIHsKKwlwcmludGYoIkNyZWF0ZVdpbmRvdyBCQUQgQ0xBU1NOQU1FICclcycgIVxuIiwgY2xhc3NOYW1lKTsKIAlyZXR1cm4gMDsKLSAgICAKKwl9ICAgIAogICAgICAgLyogQ3JlYXRlIHRoZSB3aW5kb3cgc3RydWN0dXJlICovCiAKICAgICBod25kID0gVVNFUl9IRUFQX0FMTE9DKEdNRU1fTU9WRUFCTEUsIHNpemVvZihXTkQpK2NsYXNzUHRyLT53Yy5jYlduZEV4dHJhKTsKQEAgLTI1MCw2ICsyNTIsOCBAQAogCQkJCQkJICAgIGZvcm1XaWRnZXRDbGFzcywKIAkJCQkJCSAgICB3bmRQdHItPnNoZWxsV2lkZ2V0LAogCQkJCQkJICAgIE5VTEwgKTsKKy8qCXduZFB0ci0+d2luV2lkZ2V0ID0gd25kUHRyLT5jb21wb3NpdGVXaWRnZXQ7ICovCisJd25kUHRyLT53aW5XaWRnZXQgPSB3bmRQdHItPnNoZWxsV2lkZ2V0OwogCWlmICh3bmRQdHItPndJRG1lbnUgPT0gMCkKIAl7CiAJICAgIHduZFB0ci0+bWVudUJhclB0ciA9IApAQCAtMzIyLDggKzMyNiwxMyBAQAogICAgIGlmICh3bWNyZWF0ZSA9PSAtMSkKICAgICB7CiAJICAvKiBBYm9ydCB3aW5kb3cgY3JlYXRpb24gKi8KKworCWlmIChwYXJlbnQpIHBhcmVudFB0ci0+aHduZENoaWxkID0gd25kUHRyLT5od25kTmV4dDsKKwllbHNlIGZpcnN0V2luZG93ID0gd25kUHRyLT5od25kTmV4dDsKIAlpZiAod25kUHRyLT5zaGVsbFdpZGdldCkgWHREZXN0cm95V2lkZ2V0KCB3bmRQdHItPnNoZWxsV2lkZ2V0ICk7CiAJZWxzZSBYdERlc3Ryb3lXaWRnZXQoIHduZFB0ci0+d2luV2lkZ2V0ICk7CisJaWYgKHduZFB0ci0+aGRjKSBEZWxldGVEQyggd25kUHRyLT5oZGMgKTsKKwljbGFzc1B0ci0+Y1dpbmRvd3MtLTsKIAlVU0VSX0hFQVBfRlJFRSggaHduZCApOwogCXJldHVybiAwOwogICAgIH0KQEAgLTQ0NiwyOCArNDU1LDMyIEBACiAJCSAgICAgIFh0TndpZHRoLCAmd2lkdGgsCiAJCSAgICAgIFh0TmhlaWdodCwgJmhlaWdodCwKIAkJICAgICAgTlVMTCApOwotCVNlbmRNZXNzYWdlKCBod25kLCBXTV9TSVpFLCBTSVpFX1JFU1RPUkVELCAKLQkJICAgICAod2lkdGggJiAweGZmZmYpIHwgKGhlaWdodCA8PCAxNikgKTsKLQlTZW5kTWVzc2FnZSggaHduZCwgV01fU0hPV1dJTkRPVywgVFJVRSwgMCApOwotLyoKLQlwcmludGYoIlNob3dXaW5kb3coJVgsICVYKTsgIVxuIiwgaHduZCwgY21kKTsKLSovCiAJc3dpdGNoKGNtZCkKIAkgICAgewogCSAgICBjYXNlIFNXX0hJREU6CiAJCVh0U2V0TWFwcGVkV2hlbk1hbmFnZWQod25kUHRyLT53aW5XaWRnZXQsIEZBTFNFKTsKKwkgICAgCXduZFB0ci0+ZHdTdHlsZSAmPSAoV1NfVklTSUJMRSBeIDB4RkZGRkZGRkwpOworCQlTZW5kTWVzc2FnZSggaHduZCwgV01fU0hPV1dJTkRPVywgRkFMU0UsIDAgKTsKIAkJYnJlYWs7Ci0JICAgIGNhc2UgU1dfU0hPV05BOgogCSAgICBjYXNlIFNXX1NIT1dNSU5OT0FDVElWRToKLQkgICAgY2FzZSBTV19TSE9XTk9BQ1RJVkFURToKKwkgICAgY2FzZSBTV19TSE9XTUlOSU1JWkVEOgogCSAgICBjYXNlIFNXX01JTklNSVpFOgorCSAgICAJd25kUHRyLT5kd1N0eWxlIHw9IFdTX0lDT05JQzsKKwkgICAgCWdvdG8gV0lOVmlzaWJsZTsKKwkgICAgY2FzZSBTV19TSE9XTkE6CisJICAgIGNhc2UgU1dfU0hPV05PQUNUSVZBVEU6CiAJICAgIGNhc2UgU1dfTUFYSU1JWkU6CiAJICAgIGNhc2UgU1dfU0hPV01BWElNSVpFRDoKLQkgICAgY2FzZSBTV19TSE9XTUlOSU1JWkVEOgogCSAgICBjYXNlIFNXX1NIT1c6CiAJICAgIGNhc2UgU1dfTk9STUFMOgogCSAgICBjYXNlIFNXX1NIT1dOT1JNQUw6CisJICAgIAl3bmRQdHItPmR3U3R5bGUgJj0gKFdTX0lDT05JQyBeIDB4RkZGRkZGRkwpOworV0lOVmlzaWJsZToKIAkJWHRTZXRNYXBwZWRXaGVuTWFuYWdlZCh3bmRQdHItPndpbldpZGdldCwgVFJVRSk7CisJICAgIAl3bmRQdHItPmR3U3R5bGUgfD0gV1NfVklTSUJMRTsKKwkJU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX1NJWkUsIFNJWkVfUkVTVE9SRUQsIAorCQkJKHdpZHRoICYgMHhmZmZmKSB8IChoZWlnaHQgPDwgMTYpICk7CisJCVNlbmRNZXNzYWdlKCBod25kLCBXTV9TSE9XV0lORE9XLCBUUlVFLCAwICk7CiAJCWJyZWFrOwogCSAgICBkZWZhdWx0OgogCQlicmVhazsKQEAgLTQ3OCw2ICs0OTEsNDIgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDbG9zZVdpbmRvdyAgIChVU0VSLjQzKQorICovCit2b2lkIENsb3NlV2luZG93KEhXTkQgaFduZCkKK3sKKyAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKKyAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpIHJldHVybjsKKyAgICBTaG93V2luZG93KGhXbmQsIFNXX01JTklNSVpFKTsKKyAgICBQb3N0TWVzc2FnZShoV25kLCBXTV9DTE9TRSwgMCwgMEwpOworfQorCisgCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBPcGVuSWNvbiAgIChVU0VSLjQ0KQorICovCitCT09MIE9wZW5JY29uKEhXTkQgaFduZCkKK3sKKyAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKKyAgICBpZiAoIUlzSWNvbmljKGhXbmQpKSByZXR1cm4gRkFMU0U7CisgICAgU2hvd1dpbmRvdyhoV25kLCBTV19TSE9XTk9STUFMKTsKKyAgICByZXR1cm4oVFJVRSk7Cit9CisKKyAKKyAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEZpbmRXaW5kb3cgICAoVVNFUi41MCkKKyAqLworSFdORCBGaW5kV2luZG93KExQU1RSIENsYXNzTWF0Y2gsIExQU1RSIFRpdGxlTWF0Y2gpCit7CisgICAgcmV0dXJuKChIV05EKU5VTEwpOworfQorCisgCisgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNb3ZlV2luZG93ICAgKFVTRVIuNTYpCiAgKi8KIHZvaWQgTW92ZVdpbmRvdyhIV05EIGhXbmQsIHNob3J0IHgsIHNob3J0IHksIHNob3J0IHcsIHNob3J0IGgsIEJPT0wgYlJlcGFpbnQpCkBAIC01MDgsNyArNTU3LDkgQEAKIHZvaWQgVXBkYXRlV2luZG93KCBIV05EIGh3bmQgKQogewogICAgIGlmIChHZXRVcGRhdGVSZWN0KCBod25kLCBOVUxMLCBGQUxTRSApKSAKLQlTZW5kTWVzc2FnZSggaHduZCwgV01fUEFJTlQsIDAsIDAgKTsKKyAgICB7CisJaWYgKElzV2luZG93VmlzaWJsZSggaHduZCApKSBTZW5kTWVzc2FnZSggaHduZCwgV01fUEFJTlQsIDAsIDAgKTsKKyAgICB9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01NzgsMTcgKzYyOSwxNyBAQAogICAgIFdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBoV25kICk7CiAgICAgaWYgKHduZFB0cikgCiAgICAgewotCWlmICgod0ZsYWcgJiBTV1BfTk9NT1ZFKSA9PSAwKSB7CisJaWYgKCh3RmxhZyAmIFNXUF9OT01PVkUpICE9IFNXUF9OT01PVkUpIHsKIAkgICAgd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQgICA9IHg7CiAJICAgIHduZFB0ci0+cmVjdENsaWVudC50b3AgICAgPSB5OwogCSAgICBYdFZhU2V0VmFsdWVzKHduZFB0ci0+d2luV2lkZ2V0LCBYdE54LCB4LCBYdE55LCB5LCBOVUxMICk7CiAJICAgIH0KLQlpZiAoKHdGbGFnICYgU1dQX05PU0laRSkgPT0gMCkgeworCWlmICgod0ZsYWcgJiBTV1BfTk9TSVpFKSAhPSBTV1BfTk9TSVpFKSB7CiAJICAgIHduZFB0ci0+cmVjdENsaWVudC5yaWdodCAgPSB4ICsgdzsKIAkgICAgd25kUHRyLT5yZWN0Q2xpZW50LmJvdHRvbSA9IHkgKyBoOwogCSAgICBYdFZhU2V0VmFsdWVzKHduZFB0ci0+d2luV2lkZ2V0LCBYdE53aWR0aCwgdywgWHROaGVpZ2h0LCBoLCBOVUxMICk7CiAJICAgIH0KLQlpZiAoKHdGbGFnICYgU1dQX05PUkVEUkFXKSA9PSAwKSB7CisJaWYgKCh3RmxhZyAmIFNXUF9OT1JFRFJBVykgIT0gU1dQX05PUkVEUkFXKSB7CiAJICAgIEludmFsaWRhdGVSZWN0KGhXbmQsIE5VTEwsIFRSVUUpOwogCSAgICBVcGRhdGVXaW5kb3coaFduZCk7CiAJICAgIH0KQEAgLTU5Nyw4ICs2NDgsMTAgQEAKIAlpZiAoKHdGbGFnICYgU1dQX1NIT1dXSU5ET1cpID09IFNXUF9TSE9XV0lORE9XKSAKIAkgICAgU2hvd1dpbmRvdyhoV25kLCBTV19TSE9XKTsKIC8qCi0JaWYgKCh3RmxhZyAmIFNXUF9OT0FDVElWQVRFKSA9PSAwKSAKKwlpZiAoKHdGbGFnICYgU1dQX05PQUNUSVZBVEUpICE9IFNXUF9OT0FDVElWQVRFKSAKIAkgICAgU2V0QWN0aXZlV2luZG93KGhXbmQpOworCWlmICgod0ZsYWcgJiBTV1BfTk9aT1JERVIpICE9IFNXUF9OT1pPUkRFUikgCisJICAgIHsgfQogKi8KIAlwcmludGYoIlNldFdpbmRvd1BvcyglWCwgJVgsICVkLCAlZCwgJWQsICVkLCAlWCk7ICFcbiIsIAogCQloV25kLCBoV25kSW5zZXJ0QWZ0ZXIsIHgsIHksIHcsIGgsIHdGbGFnKTsKQEAgLTY5NSwxNiArNzQ4LDIxIEBACiB9CiAKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIEdldFBhcmVudCAgICAgICAgICAgICAgKFVTRVIuNDYpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBJc0ljb25pYyAgIChVU0VSLjMxKQogICovCi1IV05EIEdldFBhcmVudChIV05EIGh3bmQpCitCT09MIElzSWNvbmljKEhXTkQgaFduZCkKIHsKLSAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGh3bmQpOwotICAgIHJldHVybiB3bmRQdHItPmh3bmRQYXJlbnQ7CisgICAgV05EICogd25kUHRyOyAKKyAgICBpZiAoaFduZCA9PSAwKSByZXR1cm4oRkFMU0UpOworICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOworICAgIGlmICh3bmRQdHIgPT0gMCkgcmV0dXJuKEZBTFNFKTsKKyAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfSUNPTklDKSByZXR1cm4oVFJVRSk7CisgICAgcmV0dXJuKEZBTFNFKTsKIH0KIAotCisgCisgCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBHZXRXaW5kb3dUZXh0ICAgICAgICAgIChVU0VSLjM2KQogICovCkBAIC03MzMsNiArNzkxLDI2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgSXNXaW5kb3cgICAgKFVTRVIuNDcpCisgKi8KK0JPT0wgSXNXaW5kb3coIEhXTkQgaHduZCApCit7CisgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKKyAgICByZXR1cm4gKHduZFB0ci0+ZHdNYWdpYyA9PSBXTkRfTUFHSUMpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBHZXRQYXJlbnQgICAgICAgICAgICAgIChVU0VSLjQ2KQorICovCitIV05EIEdldFBhcmVudChIV05EIGh3bmQpCit7CisgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKKyAgICByZXR1cm4gd25kUHRyLT5od25kUGFyZW50OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgIElzQ2hpbGQgICAgKFVTRVIuNDgpCiAgKi8KIEJPT0wgSXNDaGlsZCggSFdORCBwYXJlbnQsIEhXTkQgY2hpbGQgKQpAQCAtNzU1LDYgKzgzMywyMyBAQAogfQogCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIElzV2luZG93VmlzaWJsZSAgIChVU0VSLjQ5KQorICovCitCT09MIElzV2luZG93VmlzaWJsZShIV05EIGhXbmQpCit7CisgICAgV05EICogd25kUHRyOyAKKyAgICBpZiAoaFduZCA9PSAwKSByZXR1cm4oRkFMU0UpOworICAgIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOworICAgIGlmICh3bmRQdHIgPT0gMCkgcmV0dXJuKEZBTFNFKTsKKyAgICBpZiAod25kUHRyLT5kd1N0eWxlICYgV1NfVklTSUJMRSkgeworCWlmIChYdElzUmVhbGl6ZWQod25kUHRyLT53aW5XaWRnZXQpKSAgcmV0dXJuKFRSVUUpOworICAgIAl9CisgICAgcmV0dXJuKEZBTFNFKTsKK30KKworIAorIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgR2V0VG9wV2luZG93ICAgIChVU0VSLjIyOSkKICAqLwo=