ZGlmZiAtLWdpdCBhL2Jvb3QvY29tbW9uL3NyYy9sb2FkZXIvbGliL2JvYXJkLmMgYi9ib290L2NvbW1vbi9zcmMvbG9hZGVyL2xpYi9ib2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZGFmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9ib290L2NvbW1vbi9zcmMvbG9hZGVyL2xpYi9ib2FyZC5jCkBAIC0wLDAgKzEsNDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFpYSUMgSW5jLgorICoKKyAqLworI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPHZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvY3B1Lmg+CisjaW5jbHVkZSA8aW1hZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGxvYWRfbW9kZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3RvcF9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3VhcnQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImRkci5oIgorI2luY2x1ZGUgIi4uL2RyaXZlcnMvZWZ1c2UuaCIKKyNpbmNsdWRlICIuLi9kcml2ZXJzL2ZsYXNoLmgiCisKKyNkZWZpbmUgRkxBR1NfUEFSVElUSU9OX0VSUk9SICgweDExMTEpIC8qt9bH+NLss6MqLworCit0eXBlZGVmIHNob3J0IChpbml0X2ZuY190KSAodm9pZCk7CisKK2ludCBwcmludF9pbmZvKHZvaWQpCit7CisjaWYgZGVmaW5lZChDRkdfWkxPQUQpCisJcHJpbnRmICgiXG5JbmMgemxvYWRlciAxLjMuNFxuIik7CisjZWxzZQorCXByaW50ZiAoIlxuSW5jIHRMb2FkZXIgMS4zLjRcbiIpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY29weV90b19pcmFtMSh2b2lkKSAKK3sKKwltZW1jcHkoMHgxMDAwMDAsIDB4OGEwMDAsIDB4MjAwMCk7CS8qIFRFWFRfQkFTRT0weDEwMDAwMCAqLworCXdyaXRlbChDRkdfU1RBUlRfU1RBR0UxX1NUQVRFLCBDRkdfU1RBUlRfU1RBR0UxX0FERFIpOworfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246ICAgICAKKyAqIERlc2NyaXB0aW9uOiAKKyAqIFBhcmFtZXRlcnM6CisgKgkgSW5wdXQ6CisgKgkgT3V0cHV0OgorICogUmV0dXJuczoKKyAqIE90aGVyczogSVJBTSBhZGRyIGlzIHByb3ZpZGVkIGZyb20gYXAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KK3ZvaWQgY2xlYXJfaXJhbSggdm9pZCApCit7CisJdWludDMyX3QgaSA9IDA7CisKKwlmb3IoIGk9MHg4MjAwMDQwMDsgaTw9MHg4MjAwMzQwMDsgaSs9NCApICAgIAorCXsKKwkJd3JpdGVsKDB4MCwgaSk7CisJfQorfQorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246ICAgICAKKyAqIERlc2NyaXB0aW9uOiAKKyAqIFBhcmFtZXRlcnM6CisgKgkgSW5wdXQ6CisgKgkgT3V0cHV0OgorICogUmV0dXJuczoKKyAqIE90aGVyczoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyB2b2lkIHdyaXRlX2xvYWRlcl9tb2RlKHVpbnQzMl90IG1vZGUpCit7CisJd3JpdGVsKG1vZGUsIENGR19CT09UX01PREVfU0FWRV9BRERSX0ZPUl9VQk9PVCk7ICAKK30KKwordm9pZCBoYW5nICh2b2lkKQoreworCS8qIGNhbGwgYm9hcmQgc3BlY2lmaWMgaGFuZyBmdW5jdGlvbiAqLworCWZvciAoOzspOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246ICAgICAKKyAqIERlc2NyaXB0aW9uOiAKKyAqIFBhcmFtZXRlcnM6CisgKgkgSW5wdXQ6CisgKgorICoJIE91dHB1dDoKKyAqCisgKiBSZXR1cm5zOgorICoKKyAqCisgKiBPdGhlcnM6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHVzYl9hcGNvcmVfcG93ZXJvZmYodm9pZCkKK3sKKwl1MzIgdG1wOworCisJdG1wID1yZWFkbChVU0JfUkVTRVQpOyAvKnVzYiBoc2ljIHJlc2V0Ki8KKwl0bXAJJj0gfjB4NzsKKwl3cml0ZWwodG1wLCBVU0JfUkVTRVQpOworCQorCXRtcCA9cmVhZGwoQ09SRV9PVVRQVVRfU1dJVENIX0NPTkZJR19SRUcpOy8qYXAgY2xrJm1nIGNvbnRyb2wgYnkgc3cqLworCXRtcCAmPSB+KCgweDE8PDIpfCgweDE8PDUpKTsKKwl3cml0ZWwodG1wLCBDT1JFX09VVFBVVF9TV0lUQ0hfQ09ORklHX1JFRyk7CisJCisJdG1wID1yZWFkbChDT1JFX09VVFBVVF9TV19DT05GSUdfUkVHMSk7LyphcCBjbGsgb2ZmKi8KKwl0bXAgJj0gfigweDE8PDIpOworCXdyaXRlbCh0bXAsIENPUkVfT1VUUFVUX1NXX0NPTkZJR19SRUcxKTsJCisJCisJdG1wID1yZWFkbChDT1JFX09VVFBVVF9TV19DT05GSUdfUkVHMik7LyphcCBtZyBpc28qLworCXRtcCB8PSAoMHgxPDw1KTsKKwl3cml0ZWwodG1wLCBDT1JFX09VVFBVVF9TV19DT05GSUdfUkVHMik7CisJCisJdXNkZWxheSgxKTsKKworCXRtcCA9cmVhZGwoQ09SRV9PVVRQVVRfU1dfQ09ORklHX1JFRzIpOy8qYXAgbWcgcnN0Ki8KKwl0bXAgfD0gKDB4MTw8NCk7CisJd3JpdGVsKHRtcCwgQ09SRV9PVVRQVVRfU1dfQ09ORklHX1JFRzIpOworCQorCXVzZGVsYXkoMSk7CisKKwl0bXAgPXJlYWRsKENPUkVfT1VUUFVUX1NXX0NPTkZJR19SRUcyKTsvKmFwIG1nIG9mZiovCisJdG1wICY9IH4oMHgxPDwzKTsKKwl3cml0ZWwodG1wLCBDT1JFX09VVFBVVF9TV19DT05GSUdfUkVHMik7CQorCQorCS8vX19SRUcoMHgwMDEzYTBhYykgJj0gfigoMHgxPDwyKXwoMHgxPDw1KSk7ICAgIC8qYXAgY2xrJm1nIGNvbnRyb2wgYnkgc3cqLworCS8vX19SRUcoMHgwMDEzYTBiOCkgICAgICAgJj0gfigweDE8PDIpOyAgICAgICAgICAgICAgIC8qYXAgY2xrIG9mZiovCisJLy9fX1JFRygweDAwMTNhMGJjKSAgICAgICB8PSAoMHgxPDw1KTsgICAgICAgICAgICAgICAvKmFwIG1nIGlzbyovCisJLy9fX1JFRygweDAwMTNhMGJjKSAgICAgICB8PSAoMHgxPDw0KTsgICAgICAgICAgICAgICAvKmFwIG1nIHJzdCovCisJLy9fX1JFRygweDAwMTNhMGJjKSAgICAgICAmPSB+KDB4MTw8Myk7ICAgICAgICAgICAgICAvKmFwIG1nIG9mZiovCQorfQorCisjaWZkZWYgQ09ORklHX1pYMjk3NTIwVjNFX01ETF9BQgordm9pZCBzdGFydF9hcm1ib290ICh2b2lkKQoreworCWludDMyX3QgcmV0ID0gMDsKKwlpbnQzMl90IGFkZDsKKwl1aW50MzJfdCBhbXRfdmFsdWUgPSAwOworCWludDMyX3QgZXJyX2ZsYWcgPSAwOworICAgIFRfQk9PVF9UQVJHRVQgYm9vdFRhcmdldDsKKwlUX0JPT1RfRk9UQV9GTEFHIGZsYWdzRGF0YTsKKwlUX0JPT1RfRk9UQV9GTEFHICpmb3RhRmxhZzsKKwlUX0ZPVEFfRkxBR19JTkZPICpmb3RhRmxhZ0luZm87CisJVF9CT09UX0RVQUxTWVNURU1fVFlQRSBkdWFsU3lzdGVtVHlwZTsKKworCWNsa19pbml0KCk7CisJdGltZXJfaW5pdCgpOworI2lmIENGR19QUklOVEYKKwl1YXJ0X2luaXQoKTsKKyNlbmRpZgorCXByaW50X2luZm8oKTsKKworCS8qIEFmdGVyIHJlc2V0LCBDb3B5IHpsb2FkZXIgZm9yY2VseS4gKi8KKwkvKiBOb3cgSVJBTTEgbWF5YmUgb2NjdXBpZWQgYnkgZGlydHkgZGF0YS4gKi8KKwl3cml0ZWwoMCwgQ0ZHX1NUQVJUX1NUQUdFMV9BRERSKTsKKwlhbXRfdmFsdWUgPSByZWFkbChDRkdfQU1UX01PREVfU1dJVENIX0FERFIpOworCWNsZWFyX2lyYW0oKTsKKwl3cml0ZWwoYW10X3ZhbHVlLCBDRkdfQU1UX01PREVfU1dJVENIX0FERFIpOworCisJcmV0ID0gYm9hcmRfZmxhc2hfaW5pdCgpOworCWlmKHJldCAhPSAwKQorCXsKKwkJZ290byBlcnJvcjsKKwl9CQorCQkKKwllZnVzZV9pbml0KCk7CisKKwlpZihnZXRfZGRyX2ZsYWcoKSA9PSBDSElQX0REUl9JU18zMk0pCisJeworCQlkZHJfaW5pdChDSElQX0REUl9JU18zMk0pOworCX0KKwllbHNlIGlmKGdldF9kZHJfZmxhZygpID09IENISVBfRERSX0lTXzY0TSkKKwl7CisJCWRkcl9pbml0KENISVBfRERSX0lTXzY0TSk7CisJfQorCWVsc2UgaWYoZ2V0X2Rkcl9mbGFnKCkgPT0gQ0hJUF9ERFJfSVNfMTI4TSkKKwl7CisJCWRkcl9pbml0KENISVBfRERSX0lTXzEyOE0pOwkJCisJfQkKKwllbHNlCisJeworCQlkZHJfaW5pdChDSElQX0REUl9JU18yNTZNKTsKKwl9CisJCisJdXNiX2FwY29yZV9wb3dlcm9mZigpOworLyoqKioqKioqKioqKioqKioqKioqKiDUy9DQVC1MT0FELL34yOvPwtTYxKPKvSAqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChDRkdfVExPQUQpCisJd3JpdGVfbG9hZGVyX21vZGUoQ0ZHX1RMT0FEX01PREUpOworCisjaWYgQ0ZHX1VTQgorCXVzYl9ib290KFNZU19VU0JfQkFTRSk7CisjZW5kaWYKKworI2lmIENGR19VQVJUCisJdWFydF9ib290KCk7CisjZW5kaWYKKyAgICAKKyNlbmRpZgkvKiBDRkdfVExPQUQgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiDUy9DQWi1MT0FELL34yOvV/bOjxvS2r8Sjyr0gKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKENGR19aTE9BRCkKKwl1aW50MzJfdCB1Ym9vdF9lbnRyeV9wb2ludCA9IDA7CisJY2hhciBib290X21vZGUgPSAwOworCisJd3JpdGVfbG9hZGVyX21vZGUoQ0ZHX1pMT0FEX01PREUpOworCisJLypyZWFkIGZsYWdzt9bH+CovCisJcmV0ID0gcmVhZF9mbGFnc19pbWFnZSgodWludDhfdCAqKUZMQUdTX0lNQUdFKTsKKworCWlmKCByZXQgIT0gMCApCisJeworCQlwcmludGYoInJlYWQgZmxhZ3MgcGFydGl0aW9uIGVycm9yISBVc2UgZGVmYXVsdCBwYXJhbWV0ZXJzXG4iKTsKKwkJLy9nb3RvIGVycm9yOworCQllcnJfZmxhZyA9IDE7CisJCQorCQkvKsSsyM9mbGFnc7fWx/jK/b7dKi8KKwkJZmxhZ3NEYXRhLm1hZ2ljID0gRkxBR1NfTUFHSUM7CisJCWZsYWdzRGF0YS5ib290X3RvID0gRFVBTF9TWVNURU07CisJCWZsYWdzRGF0YS5mb3RhX3N0YXR1cyA9IDE7CisJCWZsYWdzRGF0YS5zeXN0ZW0uc3RhdHVzID0gRFVBTFNZU1RFTV9TVEFUVVNfQk9PVEFCTEU7CisJCWZsYWdzRGF0YS5zeXN0ZW0yLnN0YXR1cyA9IERVQUxTWVNURU1fU1RBVFVTX0JPT1RBQkxFOworCQlmb3RhRmxhZyA9ICZmbGFnc0RhdGE7CisJfQorCWVsc2UKKwl7CisgICAgICAgIGZvdGFGbGFnID0gKFRfQk9PVF9GT1RBX0ZMQUcgKikoQ0ZHX1RFTVBfQUREUik7CisJfQorCisJYm9vdFRhcmdldCA9IGZvdGFGbGFnLT5ib290X3RvOworCisJd3JpdGVsKERVQUxTWVNURU1fU1RBVFVTX0JPT1RBQkxFLCBCT09UX0ZMQUdfQUREUik7LyrErMjPv8nG9LavKi8KKwkKKyAgICBpZihib290VGFyZ2V0ID09IERVQUxfU1lTVEVNKQorICAgIHsKKyAgICAgICAgaWYgKGZvdGFGbGFnLT5zeXN0ZW0uc3RhdHVzID09IERVQUxTWVNURU1fU1RBVFVTX1VOQk9PVEFCTEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiZHVhbF9zeXN0ZW0gc3RhdHVzIGlzIHVuYm9vdGFibGUhIik7CisJCSAgICBnb3RvIGVycm9yOworCQl9CisJCXJldCA9IHJlYWRfdWJvb3RfaW1hZ2UoKHVpbnQ4X3QgKilVQk9PVF9JTUFHRSwgJnVib290X2VudHJ5X3BvaW50KTsgICAgCisJCWlmKCByZXQgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCJyZWFkIHVib290MSBpbWFnZSBlcnJvciwgZ290byB1Ym9vdDIhIik7CisJCQl3cml0ZWwoRFVBTFNZU1RFTV9TVEFUVVNfVU5CT09UQUJMRSwgQk9PVF9GTEFHX0FERFIpOwkJCisJCQlyZXQgPSByZWFkX3Vib290X2ltYWdlKCh1aW50OF90ICopVUJPT1QyX0lNQUdFLCAmdWJvb3RfZW50cnlfcG9pbnQpOwkJCisJCQlpZiggcmV0ICE9IDApCisJICAgICAgICB7CisJICAgICAgICAgICAgcHJpbnRmKCJyZWFkIHVib290MiBpYW1nZSBlcnJvciEiKTsKKwkJCQlnb3RvIGVycm9yOwkKKwkJCX0KKwkJfQorCQllbHNlCQorCQkgICAgcHJpbnRmKCJnb3RvIHVib290ISIpOworCX0KKyAgICBlbHNlIGlmKGJvb3RUYXJnZXQgPT0gRFVBTF9TWVNURU0yKQorICAgIHsKKyAgICAgICAgaWYgKGZvdGFGbGFnLT5zeXN0ZW0yLnN0YXR1cyA9PSBEVUFMU1lTVEVNX1NUQVRVU19VTkJPT1RBQkxFKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoImR1YWxfc3lzdGVtMiBzdGF0dXMgaXMgdW5ib290YWJsZSEiKTsKKwkJICAgIGdvdG8gZXJyb3I7CisJCX0KKwkJcmV0ID0gcmVhZF91Ym9vdF9pbWFnZSgodWludDhfdCAqKVVCT09UMl9JTUFHRSwgJnVib290X2VudHJ5X3BvaW50KTsJCQorCQlpZiggcmV0ICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigicmVhZCB1Ym9vdDIgaWFtZ2UgZXJyb3IsIGdvdG8gdWJvb3QhIik7CisJCQl3cml0ZWwoRFVBTFNZU1RFTV9TVEFUVVNfVU5CT09UQUJMRSwgQk9PVF9GTEFHX0FERFIpOwkKKwkJCXJldCA9IHJlYWRfdWJvb3RfaW1hZ2UoKHVpbnQ4X3QgKilVQk9PVF9JTUFHRSwgJnVib290X2VudHJ5X3BvaW50KTsJCQorCQkJaWYoIHJldCAhPSAwKQorCSAgICAgICAgeworCSAgICAgICAgICAgIHByaW50ZigicmVhZCB1Ym9vdCBpYW1nZSBlcnJvciEiKTsKKwkJCQlnb3RvIGVycm9yOwkKKwkJCX0KKwkJfQorCQllbHNlCisJCSAgICBwcmludGYoImdvdG8gdWJvb3QyISIpOworCX0KKwllbHNlCisJeworCQlwcmludGYoImJvb3QgdGFyZ2V0IGdldCBlcnJvciEiKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZihlcnJfZmxhZyA9PSAxKQorCXsKKyAgICAgICAgd3JpdGVsKEZMQUdTX1BBUlRJVElPTl9FUlJPUiwgQk9PVF9GTEFHX0FERFIpOworCX0KKwkKKwlwcmludGYoInJlYWQgdWJvb3Qgb2suXG4iKTsKKwkKKwkvKiBzZXQgYXJtIGp1bXAgUEMgc3RhcnQgY29kZSAgKi8KKwl3cml0ZWwoMHhFNTlmZjAwMCwgU1lTX0lSQU0xX0JBU0UpOwkJCQorCXdyaXRlbCh1Ym9vdF9lbnRyeV9wb2ludCwgU1lTX0lSQU0xX0JBU0UgKyA4KTsKKworCXByaW50Zigic3RhcnQgdWJvb3QuLi5cbiIpOworCS8qIFJlbGVzZSBBOSBDb3JlLCBBOSBzdGFydCB0byBydW4gdWJvb3QgcmlnaHQgbm93LiAqLworCXdyaXRlbChDUFVfVUZJX1NXX1JTVEVOLCBDUFVfQTlfU1VCU1lTX0NGRyk7CQorCisKKwkvKiB3YWl0aW5nIGZvciB1Ym9vdCByZWFkIG0wIGltYWdlLiAqLworCXVpbnQzMl90IG0wX2VudHJ5X3BvaW50ID0gMDsKKwlyZXQgPSBuYW5kX3JlYWRfbTAoJm0wX2VudHJ5X3BvaW50KTsKKwlpZihyZXQgIT0gMCkKKwl7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogTTAgQ29yZSBzdGFydCB0byBydW4gY3B1cnBtIHJpZ2h0IG5vdy4gKi8KKwkoKGluaXRfZm5jX3QgKiltMF9lbnRyeV9wb2ludCkoKTsKKwkKKyNlbmRpZgorCitlcnJvcjoKKwlwcmludGYoIkVSUlxuIik7CisJaGFuZygpOworfQorI2Vsc2UKK3ZvaWQgc3RhcnRfYXJtYm9vdCAodm9pZCkKK3sKKwlpbnQzMl90IHJldCA9IDA7CisJdWludDMyX3QgYW10X3ZhbHVlID0gMDsKKworCisJY2xrX2luaXQoKTsKKwl0aW1lcl9pbml0KCk7CisjaWYgQ0ZHX1BSSU5URgorCXVhcnRfaW5pdCgpOworI2VuZGlmCisJcHJpbnRfaW5mbygpOworCisJLyogQWZ0ZXIgcmVzZXQsIENvcHkgemxvYWRlciBmb3JjZWx5LiAqLworCS8qIE5vdyBJUkFNMSBtYXliZSBvY2N1cGllZCBieSBkaXJ0eSBkYXRhLiAqLworCXdyaXRlbCgwLCBDRkdfU1RBUlRfU1RBR0UxX0FERFIpOworCWFtdF92YWx1ZSA9IHJlYWRsKENGR19BTVRfTU9ERV9TV0lUQ0hfQUREUik7CisJY2xlYXJfaXJhbSgpOworCXdyaXRlbChhbXRfdmFsdWUsIENGR19BTVRfTU9ERV9TV0lUQ0hfQUREUik7CisKKwlyZXQgPSBib2FyZF9mbGFzaF9pbml0KCk7CisJaWYocmV0ICE9IDApCisJeworCQlnb3RvIGVycm9yOworCX0JCisJCQorCWVmdXNlX2luaXQoKTsKKworCWlmKGdldF9kZHJfZmxhZygpID09IENISVBfRERSX0lTXzMyTSkKKwl7CisJCWRkcl9pbml0KENISVBfRERSX0lTXzMyTSk7CisJfQorCWVsc2UgaWYoZ2V0X2Rkcl9mbGFnKCkgPT0gQ0hJUF9ERFJfSVNfNjRNKQorCXsKKwkJZGRyX2luaXQoQ0hJUF9ERFJfSVNfNjRNKTsKKwl9CisJZWxzZSBpZihnZXRfZGRyX2ZsYWcoKSA9PSBDSElQX0REUl9JU18xMjhNKQorCXsKKwkJZGRyX2luaXQoQ0hJUF9ERFJfSVNfMTI4TSk7CQkKKwl9CQorCWVsc2UKKwl7CisJCWRkcl9pbml0KENISVBfRERSX0lTXzI1Nk0pOworCX0KKwkKKwkKKwl1c2JfYXBjb3JlX3Bvd2Vyb2ZmKCk7CisvKioqKioqKioqKioqKioqKioqKioqINTL0NBULUxPQUQsvfjI68/C1NjEo8q9ICoqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKENGR19UTE9BRCkKKwl3cml0ZV9sb2FkZXJfbW9kZShDRkdfVExPQURfTU9ERSk7CisKKyNpZiBDRkdfVVNCCisJdXNiX2Jvb3QoU1lTX1VTQl9CQVNFKTsKKyNlbmRpZgorCisjaWYgQ0ZHX1VBUlQKKwl1YXJ0X2Jvb3QoKTsKKyNlbmRpZgorICAgIAorI2VuZGlmCS8qIENGR19UTE9BRCAqLworCisvKioqKioqKioqKioqKioqKioqKioqINTL0NBaLUxPQUQsvfjI69X9s6PG9LavxKPKvSAqKioqKioqKioqLworI2lmIGRlZmluZWQoQ0ZHX1pMT0FEKQorCXVpbnQzMl90IHVib290X2VudHJ5X3BvaW50ID0gMDsKKwljaGFyIGJvb3RfbW9kZSA9IDA7CisKKwl3cml0ZV9sb2FkZXJfbW9kZShDRkdfWkxPQURfTU9ERSk7CisKKwlyZXQgPSByZWFkX3Vib290X2ltYWdlKCh1aW50OF90ICopVUJPT1RfSU1BR0UsICZ1Ym9vdF9lbnRyeV9wb2ludCk7CisJaWYoIHJldCAhPSAwICkKKwl7CisJCWJvb3RfbW9kZSA9IGdldF9ib290X21vZGUoKTsKKwkJaWYoKGJvb3RfbW9kZSA9PSBTUElfTkFORF9CT09UKSB8fCAoYm9vdF9tb2RlID09IE5BTkRfQk9PVCkpCisJCXsKKwkJCXJldCA9IHJlYWRfdWJvb3RfaW1hZ2UoKHVpbnQ4X3QgKilVQk9PVF9NSVJST1JfSU1BR0UsIAorCQkJCQkJCQkJJnVib290X2VudHJ5X3BvaW50KTsKKwkJCWlmKHJldCAhPSAwKQorCQkJeworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCXByaW50ZigicmVhZCB1Ym9vdCBvay5cbiIpOworCQorCS8qIHNldCBhcm0ganVtcCBQQyBzdGFydCBjb2RlICAqLworCXdyaXRlbCgweEU1OWZmMDAwLCBTWVNfSVJBTTFfQkFTRSk7CQkJCisJd3JpdGVsKHVib290X2VudHJ5X3BvaW50LCBTWVNfSVJBTTFfQkFTRSArIDgpOworCisJcHJpbnRmKCJzdGFydCB1Ym9vdC4uLlxuIik7CisJLyogUmVsZXNlIEE5IENvcmUsIEE5IHN0YXJ0IHRvIHJ1biB1Ym9vdCByaWdodCBub3cuICovCisJd3JpdGVsKENQVV9VRklfU1dfUlNURU4sIENQVV9BOV9TVUJTWVNfQ0ZHKTsJCisKKworCS8qIHdhaXRpbmcgZm9yIHVib290IHJlYWQgbTAgaW1hZ2UuICovCisJdWludDMyX3QgbTBfZW50cnlfcG9pbnQgPSAwOworCXJldCA9IG5hbmRfcmVhZF9tMCgmbTBfZW50cnlfcG9pbnQpOworCWlmKHJldCAhPSAwKQorCXsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBNMCBDb3JlIHN0YXJ0IHRvIHJ1biBjcHVycG0gcmlnaHQgbm93LiAqLworCSgoaW5pdF9mbmNfdCAqKW0wX2VudHJ5X3BvaW50KSgpOworCQorI2VuZGlmCisKK2Vycm9yOgorCXByaW50ZigiRVJSXG4iKTsKKwloYW5nKCk7Cit9CisjZW5kaWYK