ZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9LY29uZmlnIGIvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKaW5kZXggMzQ1MzY1OC4uOTY5M2U5YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL0tjb25maWcKQEAgLTkxLDYgKzkxLDEzIEBACiAJICBLZXJuZWwgaW50ZXJuYWwgdGltZXIgZnJlcXVlbmN5IHNob3VsZCBiZSBhIGRpdmlzb3Igb2YgMzI3NjgsCiAJICBzdWNoIGFzIDY0IG9yIDEyOC4KIAorY29uZmlnIE9NQVBfRE1fVElNRVIKKwlib29sICJVc2UgZHVhbC1tb2RlIHRpbWVyIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMTZYWAorCWhlbHAKKwkgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSBPTUFQIER1YWwtTW9kZSB0aW1lcnMuCisKIGNob2ljZQogCXByb21wdCAiTG93LWxldmVsIGRlYnVnIGNvbnNvbGUgVUFSVCIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUApAQCAtMTA3LDYgKzExNCwxNSBAQAogCiBlbmRjaG9pY2UKIAorY29uZmlnIE9NQVBfU0VSSUFMX1dBS0UKKwlib29sICJFbmFibGUgd2FrZS11cCBldmVudHMgZm9yIHNlcmlhbCBwb3J0cyIKKwlkZXBlbmRzIE9NQVBfTVVYCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGhhdmUgeW91ciBzeXN0ZW0gd2FrZSB1cAorCSAgdG8gZGF0YSBvbiB0aGUgc2VyaWFsIFJYIGxpbmUuIFRoaXMgYWxsb3dzIHlvdSB0byB3YWtlIHRoZQorCSAgc3lzdGVtIGZyb20gc2VyaWFsIGNvbnNvbGUuCisKIGVuZG1lbnUKIAogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZSBiL2FyY2gvYXJtL3BsYXQtb21hcC9NYWtlZmlsZQppbmRleCA1MzFlMTFhLi43ZTE0NGY5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL01ha2VmaWxlCkBAIC0zLDcgKzMsNyBAQAogIwogCiAjIENvbW1vbiBzdXBwb3J0Ci1vYmoteSA6PSBjb21tb24ubyBkbWEubyBjbG9jay5vIG11eC5vIGdwaW8ubyBtY2JzcC5vIHVzYi5vCitvYmoteSA6PSBjb21tb24ubyBzcmFtLm8gc3JhbS1mbi5vIGNsb2NrLm8gZG1hLm8gbXV4Lm8gZ3Bpby5vIG1jYnNwLm8gdXNiLm8KIG9iai1tIDo9CiBvYmotbiA6PQogb2JqLSAgOj0KQEAgLTE1LDMgKzE1LDUgQEAKIG9iai0kKENPTkZJR19QTSkgKz0gcG0ubyBzbGVlcC5vCiAKIG9iai0kKENPTkZJR19DUFVfRlJFUSkgKz0gY3B1LW9tYXAubworb2JqLSQoQ09ORklHX09NQVBfRE1fVElNRVIpICs9IGRtdGltZXIubworCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvY2xvY2suYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCmluZGV4IDU5ZDkxYjMuLjUyYTU4YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jbG9jay5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvdXNiLmg+CiAKICNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgInNyYW0uaCIKIAogc3RhdGljIExJU1RfSEVBRChjbG9ja3MpOwogc3RhdGljIERFQ0xBUkVfTVVURVgoY2xvY2tzX3NlbSk7CkBAIC0xNDEsNyArMTQyLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIGFybXBlcl9jayA9IHsKIAkubmFtZQkJPSAiYXJtcGVyX2NrIiwKIAkucGFyZW50CQk9ICZja19kcGxsMSwKLQkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDczMCB8IENMT0NLX0lOX09NQVAxNTEwIHwgQ0xPQ0tfSU5fT01BUDE2WFggfAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwKIAkJCSAgUkFURV9DS0NUTCwKIAkuZW5hYmxlX3JlZwk9IEFSTV9JRExFQ1QyLAogCS5lbmFibGVfYml0CT0gRU5fUEVSQ0ssCkBAIC0zODUsNyArMzg2LDggQEAKIAkubmFtZQkJPSAidWFydDJfY2siLAogCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLwogCS5yYXRlCQk9IDEyMDAwMDAwLAotCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTUxMCB8IENMT0NLX0lOX09NQVAxNlhYIHwgRU5BQkxFX1JFR18zMkJJVCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfSU5fT01BUDE1MTAgfCBDTE9DS19JTl9PTUFQMTZYWCB8IEVOQUJMRV9SRUdfMzJCSVQgfAorCQkJICBBTFdBWVNfRU5BQkxFRCwKIAkuZW5hYmxlX3JlZwk9IE1PRF9DT05GX0NUUkxfMCwKIAkuZW5hYmxlX2JpdAk9IDMwLAkvKiBDaG9vc2VzIGJldHdlZW4gMTJNSHogYW5kIDQ4TUh6ICovCiAJLnNldF9yYXRlCT0gJnNldF91YXJ0X3JhdGUsCkBAIC00NDMsNiArNDQ1LDE1IEBACiAJLmVuYWJsZV9iaXQJPSA4IC8qIFVIT1NUX0VOICovLAogfTsKIAorc3RhdGljIHN0cnVjdCBjbGsgdXNiX2RjX2NrID0geworCS5uYW1lCQk9ICJ1c2JfZGNfY2siLAorCS8qIERpcmVjdCBmcm9tIFVMUEQsIG5vIHBhcmVudCAqLworCS5yYXRlCQk9IDQ4MDAwMDAwLAorCS5mbGFncwkJPSBDTE9DS19JTl9PTUFQMTZYWCB8IFJBVEVfRklYRUQsCisJLmVuYWJsZV9yZWcJPSBTT0ZUX1JFUV9SRUcsCisJLmVuYWJsZV9iaXQJPSA0LAorfTsKKwogc3RhdGljIHN0cnVjdCBjbGsgbWNsa18xNTEwID0gewogCS5uYW1lCQk9ICJtY2xrIiwKIAkvKiBEaXJlY3QgZnJvbSBVTFBELCBubyBwYXJlbnQuIE1heSBiZSBlbmFibGVkIGJ5IGV4dCBoYXJkd2FyZS4gKi8KQEAgLTU1Miw2ICs1NjMsNyBAQAogCSZ1YXJ0M18xNnh4LAogCSZ1c2JfY2xrbywKIAkmdXNiX2hoY19jazE1MTAsICZ1c2JfaGhjX2NrMTZ4eCwKKwkmdXNiX2RjX2NrLAogCSZtY2xrXzE1MTAsICAmbWNsa18xNnh4LAogCSZiY2xrXzE1MTAsICAmYmNsa18xNnh4LAogCSZtbWMxX2NrLApAQCAtOTQ2LDE0ICs5NTgsMTMgQEAKIAlpZiAoIXB0ci0+cmF0ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIXB0ci0+cmF0ZSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiBJbiBtb3N0IGNhc2VzIHdlIHNob3VsZCBub3QgbmVlZCB0byByZXByb2dyYW0gRFBMTC4KKwkgKiBSZXByb2dyYW1taW5nIHRoZSBEUExMIGlzIHRyaWNreSwgaXQgbXVzdCBiZSBkb25lIGZyb20gU1JBTS4KKwkgKi8KKwlvbWFwX3NyYW1fcmVwcm9ncmFtX2Nsb2NrKHB0ci0+ZHBsbGN0bF92YWwsIHB0ci0+Y2tjdGxfdmFsKTsKIAotCWlmICh1bmxpa2VseShja19kcGxsMS5yYXRlID09IDApKSB7Ci0JCW9tYXBfd3JpdGV3KHB0ci0+ZHBsbGN0bF92YWwsIERQTExfQ1RMKTsKLQkJY2tfZHBsbDEucmF0ZSA9IHB0ci0+cGxsX3JhdGU7Ci0JfQotCW9tYXBfd3JpdGV3KHB0ci0+Y2tjdGxfdmFsLCBBUk1fQ0tDVEwpOworCWNrX2RwbGwxLnJhdGUgPSBwdHItPnBsbF9yYXRlOwogCXByb3BhZ2F0ZV9yYXRlKCZja19kcGxsMSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjI0LDkgKzEyMzUsMTEgQEAKICNlbmRpZgogCS8qIENhY2hlIHJhdGVzIGZvciBjbG9ja3MgY29ubmVjdGVkIHRvIGNrX3JlZiAobm90IGRwbGwxKSAqLwogCXByb3BhZ2F0ZV9yYXRlKCZja19yZWYpOwotCXByaW50ayhLRVJOX0lORk8gIkNsb2NraW5nIHJhdGUgKHh0YWwvRFBMTDEvTVBVKTogJWxkLiUwMWxkLyVsZC8lbGQgTUh6XG4iLAorCXByaW50ayhLRVJOX0lORk8gIkNsb2NraW5nIHJhdGUgKHh0YWwvRFBMTDEvTVBVKTogIgorCQkiJWxkLiUwMWxkLyVsZC4lMDFsZC8lbGQuJTAxbGQgTUh6XG4iLAogCSAgICAgICBja19yZWYucmF0ZSAvIDEwMDAwMDAsIChja19yZWYucmF0ZSAvIDEwMDAwMCkgJSAxMCwKLQkgICAgICAgY2tfZHBsbDEucmF0ZSwgYXJtX2NrLnJhdGUpOworCSAgICAgICBja19kcGxsMS5yYXRlIC8gMTAwMDAwMCwgKGNrX2RwbGwxLnJhdGUgLyAxMDAwMDApICUgMTAsCisJICAgICAgIGFybV9jay5yYXRlIC8gMTAwMDAwMCwgKGFybV9jay5yYXRlIC8gMTAwMDAwKSAlIDEwKTsKIAogI2lmZGVmIENPTkZJR19NQUNIX09NQVBfUEVSU0VVUzIKIAkvKiBTZWxlY3Qgc2xpY2VyIG91dHB1dCBhcyBPTUFQIGlucHV0IGNsb2NrICovCkBAIC0xMjcxLDcgKzEyODQsOSBAQAogCXN0cnVjdCBjbGsgKnA7CiAJX191MzIgcmVndmFsMzI7CiAKLQlvbWFwX3dyaXRldygwLCBTT0ZUX1JFUV9SRUcpOworCS8qIFVTQl9SRVFfRU4gd2lsbCBiZSBkaXNhYmxlZCBsYXRlciBpZiBuZWNlc3NhcnkgKHVzYl9kY19jaykgKi8KKwlyZWd2YWwzMiA9IG9tYXBfcmVhZHcoU09GVF9SRVFfUkVHKSAmICgxIDw8IDQpOworCW9tYXBfd3JpdGV3KHJlZ3ZhbDMyLCBTT0ZUX1JFUV9SRUcpOwogCW9tYXBfd3JpdGV3KDAsIFNPRlRfUkVRX1JFRzIpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2xvY2tzLCBub2RlKSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvY29tbW9uLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvY29tbW9uLmMKaW5kZXggZWE5NjdhOC4uNmNiMjBhZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9jb21tb24uYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKICNpbmNsdWRlIDxhc20vYXJjaC9ib2FyZC5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL211eC5oPgpAQCAtMzUsMTEgKzM2LDExIEBACiAKICNkZWZpbmUgTk9fTEVOR1RIX0NIRUNLIDB4ZmZmZmZmZmYKIAotZXh0ZXJuIGludCBvbWFwX2Jvb3Rsb2FkZXJfdGFnX2xlbjsKLWV4dGVybiB1OCBvbWFwX2Jvb3Rsb2FkZXJfdGFnW107Cit1bnNpZ25lZCBjaGFyIG9tYXBfYm9vdGxvYWRlcl90YWdbNTEyXTsKK2ludCBvbWFwX2Jvb3Rsb2FkZXJfdGFnX2xlbjsKIAogc3RydWN0IG9tYXBfYm9hcmRfY29uZmlnX2tlcm5lbCAqb21hcF9ib2FyZF9jb25maWc7Ci1pbnQgb21hcF9ib2FyZF9jb25maWdfc2l6ZSA9IDA7CitpbnQgb21hcF9ib2FyZF9jb25maWdfc2l6ZTsKIAogc3RhdGljIGNvbnN0IHZvaWQgKmdldF9jb25maWcodTE2IHRhZywgc2l6ZV90IGxlbiwgaW50IHNraXAsIHNpemVfdCAqbGVuX291dCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbWEuYwppbmRleCBjMGE1YzJmLi5kYTdiNjUxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2RtYS5jCkBAIC00MjUsNyArNDI1LDcgQEAKIAkJZG1hX2NoYW5bY2ggKyA2XS5zYXZlZF9jc3IgPSBjc3IgPj4gNzsKIAkJY3NyICY9IDB4N2Y7CiAJfQotCWlmICghY3NyKQorCWlmICgoY3NyICYgMHgzZikgPT0gMCkKIAkJcmV0dXJuIDA7CiAJaWYgKHVubGlrZWx5KGRtYV9jaGFuW2NoXS5kZXZfaWQgPT0gLTEpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNwdXJpb3VzIGludGVycnVwdCBmcm9tIERNQSBjaGFubmVsICVkIChDU1IgJTA0eClcbiIsCkBAIC04OTAsMTEgKzg5MCwxMSBAQAogCXcgfD0gMSA8PCA4OwogCW9tYXBfd3JpdGV3KHcsIE9NQVAxNjEwX0RNQV9MQ0RfQ1RSTCk7CiAKKwlsY2RfZG1hLmFjdGl2ZSA9IDE7CisKIAl3ID0gb21hcF9yZWFkdyhPTUFQMTYxMF9ETUFfTENEX0NDUik7CiAJdyB8PSAxIDw8IDc7CiAJb21hcF93cml0ZXcodywgT01BUDE2MTBfRE1BX0xDRF9DQ1IpOwotCi0JbGNkX2RtYS5hY3RpdmUgPSAxOwogfQogCiB2b2lkIG9tYXBfc2V0dXBfbGNkX2RtYSh2b2lkKQpAQCAtOTY1LDggKzk2NSw4IEBACiAgKi8KIGRtYV9hZGRyX3Qgb21hcF9nZXRfZG1hX3NyY19wb3MoaW50IGxjaCkKIHsKLQlyZXR1cm4gKGRtYV9hZGRyX3QpIChPTUFQX0RNQV9DU1NBX0wobGNoKSB8Ci0JCQkgICAgIChPTUFQX0RNQV9DU1NBX1UobGNoKSA8PCAxNikpOworCXJldHVybiAoZG1hX2FkZHJfdCkgKG9tYXBfcmVhZHcoT01BUF9ETUFfQ1NTQV9MKGxjaCkpIHwKKwkob21hcF9yZWFkdyhPTUFQX0RNQV9DU1NBX1UobGNoKSkgPDwgMTYpKTsKIH0KIAogLyoKQEAgLTk3OSw4ICs5NzksMTggQEAKICAqLwogZG1hX2FkZHJfdCBvbWFwX2dldF9kbWFfZHN0X3BvcyhpbnQgbGNoKQogewotCXJldHVybiAoZG1hX2FkZHJfdCkgKE9NQVBfRE1BX0NEU0FfTChsY2gpIHwKLQkJCSAgICAgKE9NQVBfRE1BX0NEU0FfVShsY2gpIDw8IDE2KSk7CisJcmV0dXJuIChkbWFfYWRkcl90KSAob21hcF9yZWFkdyhPTUFQX0RNQV9DRFNBX0wobGNoKSkgfAorCShvbWFwX3JlYWR3KE9NQVBfRE1BX0NEU0FfVShsY2gpKSA8PCAxNikpOworfQorCisvKgorICogUmV0dXJucyBjdXJyZW50IHNvdXJjZSB0cmFuc2ZlciBjb3VudGluZyBmb3IgdGhlIGdpdmVuIERNQSBjaGFubmVsLgorICogQ2FuIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgcHJvZ3Jlc3Mgb2YgYSB0cmFuc2ZlciBpbnNpZGUgYSAgYmxvY2suCisgKiBJdCBtdXN0IGJlIGNhbGxlZCB3aXRoIGRpc2FibGVkIGludGVycnVwdHMuCisgKi8KK2ludCBvbWFwX2dldF9kbWFfc3JjX2FkZHJfY291bnRlcihpbnQgbGNoKQoreworCXJldHVybiAoZG1hX2FkZHJfdCkgb21hcF9yZWFkdyhPTUFQX0RNQV9DU0FDKGxjaCkpOwogfQogCiBpbnQgb21hcF9kbWFfcnVubmluZyh2b2lkKQpAQCAtMTA3Niw2ICsxMDg2LDcgQEAKIAogRVhQT1JUX1NZTUJPTChvbWFwX2dldF9kbWFfc3JjX3Bvcyk7CiBFWFBPUlRfU1lNQk9MKG9tYXBfZ2V0X2RtYV9kc3RfcG9zKTsKK0VYUE9SVF9TWU1CT0wob21hcF9nZXRfZG1hX3NyY19hZGRyX2NvdW50ZXIpOwogRVhQT1JUX1NZTUJPTChvbWFwX2NsZWFyX2RtYSk7CiBFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2RtYV9wcmlvcml0eSk7CiBFWFBPUlRfU1lNQk9MKG9tYXBfcmVxdWVzdF9kbWEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RtdGltZXIuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbXRpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0NjhkNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbXRpbWVyLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvZG10aW1lci5jCisgKgorICogT01BUCBEdWFsLU1vZGUgVGltZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IE5va2lhIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IExhdXJpIExldWtrdW5lbiA8bGF1cmkubGV1a2t1bmVuQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4KKyAqIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2RtdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNkZWZpbmUgT01BUF9USU1FUl9DT1VOVAkJOAorCisjZGVmaW5lIE9NQVBfVElNRVJfSURfUkVHCQkweDAwCisjZGVmaW5lIE9NQVBfVElNRVJfT0NQX0NGR19SRUcJCTB4MTAKKyNkZWZpbmUgT01BUF9USU1FUl9TWVNfU1RBVF9SRUcJCTB4MTQKKyNkZWZpbmUgT01BUF9USU1FUl9TVEFUX1JFRwkJMHgxOAorI2RlZmluZSBPTUFQX1RJTUVSX0lOVF9FTl9SRUcJCTB4MWMKKyNkZWZpbmUgT01BUF9USU1FUl9XQUtFVVBfRU5fUkVHCTB4MjAKKyNkZWZpbmUgT01BUF9USU1FUl9DVFJMX1JFRwkJMHgyNAorI2RlZmluZSBPTUFQX1RJTUVSX0NPVU5URVJfUkVHCQkweDI4CisjZGVmaW5lIE9NQVBfVElNRVJfTE9BRF9SRUcJCTB4MmMKKyNkZWZpbmUgT01BUF9USU1FUl9UUklHR0VSX1JFRwkJMHgzMAorI2RlZmluZSBPTUFQX1RJTUVSX1dSSVRFX1BFTkRfUkVHIAkweDM0CisjZGVmaW5lIE9NQVBfVElNRVJfTUFUQ0hfUkVHCQkweDM4CisjZGVmaW5lIE9NQVBfVElNRVJfQ0FQVFVSRV9SRUcJCTB4M2MKKyNkZWZpbmUgT01BUF9USU1FUl9JRl9DVFJMX1JFRwkJMHg0MAorCisKK3N0YXRpYyBzdHJ1Y3QgZG10aW1lcl9pbmZvX3N0cnVjdCB7CisJc3RydWN0IGxpc3RfaGVhZAl1bnVzZWRfdGltZXJzOworCXN0cnVjdCBsaXN0X2hlYWQJcmVzZXJ2ZWRfdGltZXJzOworfSBkbV90aW1lcl9pbmZvOworCitzdGF0aWMgc3RydWN0IG9tYXBfZG1fdGltZXIgZG1fdGltZXJzW10gPSB7CisJeyAuYmFzZT0weGZmZmIxNDAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVIxIH0sCisJeyAuYmFzZT0weGZmZmIxYzAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVIyIH0sCisJeyAuYmFzZT0weGZmZmIyNDAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVIzIH0sCisJeyAuYmFzZT0weGZmZmIyYzAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVI0IH0sCisJeyAuYmFzZT0weGZmZmIzNDAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVI1IH0sCisJeyAuYmFzZT0weGZmZmIzYzAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVI2IH0sCisJeyAuYmFzZT0weGZmZmI0NDAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVI3IH0sCisJeyAuYmFzZT0weGZmZmI0YzAwLCAuaXJxPUlOVF8xNjEwX0dQVElNRVI4IH0sCisJeyAuYmFzZT0weDAgfSwKK307CisKKworc3RhdGljIHNwaW5sb2NrX3QgZG1fdGltZXJfbG9jazsKKworCitpbmxpbmUgdm9pZCBvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCByZWcsIHUzMiB2YWx1ZSkKK3sKKwlvbWFwX3dyaXRlbCh2YWx1ZSwgdGltZXItPmJhc2UgKyByZWcpOworCXdoaWxlIChvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX1dSSVRFX1BFTkRfUkVHKSkKKwkJOworfQorCit1MzIgb21hcF9kbV90aW1lcl9yZWFkX3JlZyhzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCByZWcpCit7CisJcmV0dXJuIG9tYXBfcmVhZGwodGltZXItPmJhc2UgKyByZWcpOworfQorCitpbnQgb21hcF9kbV90aW1lcnNfYWN0aXZlKHZvaWQpCit7CisJc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyOworCisJZm9yICh0aW1lciA9ICZkbV90aW1lcnNbMF07IHRpbWVyLT5iYXNlOyArK3RpbWVyKQorCQlpZiAob21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRykgJgorCQkgICAgT01BUF9USU1FUl9DVFJMX1NUKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIG9tYXBfZG1fdGltZXJfc2V0X3NvdXJjZShzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIGludCBzb3VyY2UpCit7CisJaW50IG4gPSAodGltZXIgLSBkbV90aW1lcnMpIDw8IDE7CisJdTMyIGw7CisKKwlsID0gb21hcF9yZWFkbChNT0RfQ09ORl9DVFJMXzEpICYgfigweDAzIDw8IG4pOworCWwgfD0gc291cmNlIDw8IG47CisJb21hcF93cml0ZWwobCwgTU9EX0NPTkZfQ1RSTF8xKTsKK30KKworCitzdGF0aWMgdm9pZCBvbWFwX2RtX3RpbWVyX3Jlc2V0KHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwkvKiBSZXNldCBhbmQgc2V0IHBvc3RlZCBtb2RlICovCisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfSUZfQ1RSTF9SRUcsIDB4MDYpOworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX09DUF9DRkdfUkVHLCAweDAyKTsKKworCW9tYXBfZG1fdGltZXJfc2V0X3NvdXJjZSh0aW1lciwgT01BUF9USU1FUl9TUkNfQVJNWE9SKTsKK30KKworCisKK3N0cnVjdCBvbWFwX2RtX3RpbWVyICogb21hcF9kbV90aW1lcl9yZXF1ZXN0KHZvaWQpCit7CisJc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtX3RpbWVyX2xvY2ssIGZsYWdzKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmRtX3RpbWVyX2luZm8udW51c2VkX3RpbWVycykpIHsKKwkJdGltZXIgPSAoc3RydWN0IG9tYXBfZG1fdGltZXIgKikKKwkJCQlkbV90aW1lcl9pbmZvLnVudXNlZF90aW1lcnMubmV4dDsKKwkJbGlzdF9tb3ZlX3RhaWwoKHN0cnVjdCBsaXN0X2hlYWQgKil0aW1lciwKKwkJCQkmZG1fdGltZXJfaW5mby5yZXNlcnZlZF90aW1lcnMpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdGltZXI7Cit9CisKKwordm9pZCBvbWFwX2RtX3RpbWVyX2ZyZWUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlvbWFwX2RtX3RpbWVyX3Jlc2V0KHRpbWVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbV90aW1lcl9sb2NrLCBmbGFncyk7CisJbGlzdF9tb3ZlX3RhaWwoKHN0cnVjdCBsaXN0X2hlYWQgKil0aW1lciwgJmRtX3RpbWVyX2luZm8udW51c2VkX3RpbWVycyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1fdGltZXJfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIG9tYXBfZG1fdGltZXJfc2V0X2ludF9lbmFibGUoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLAorCQkJCXVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9JTlRfRU5fUkVHLCB2YWx1ZSk7Cit9CisKK3Vuc2lnbmVkIGludCBvbWFwX2RtX3RpbWVyX3JlYWRfc3RhdHVzKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwlyZXR1cm4gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9TVEFUX1JFRyk7Cit9CisKK3ZvaWQgb21hcF9kbV90aW1lcl93cml0ZV9zdGF0dXMoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfU1RBVF9SRUcsIHZhbHVlKTsKK30KKwordm9pZCBvbWFwX2RtX3RpbWVyX2VuYWJsZV9hdXRvcmVsb2FkKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwl1MzIgbDsKKwlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7CisJbCB8PSBPTUFQX1RJTUVSX0NUUkxfQVI7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIGwpOworfQorCit2b2lkIG9tYXBfZG1fdGltZXJfdHJpZ2dlcihzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCit7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfVFJJR0dFUl9SRUcsIDEpOworfQorCit2b2lkIG9tYXBfZG1fdGltZXJfc2V0X3RyaWdnZXIoc3RydWN0IG9tYXBfZG1fdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdTMyIGw7CisKKwlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7CisJbCB8PSB2YWx1ZSAmIDB4MzsKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRywgbCk7Cit9CisKK3ZvaWQgb21hcF9kbV90aW1lcl9zdGFydChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCit7CisJdTMyIGw7CisKKwlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7CisJbCB8PSBPTUFQX1RJTUVSX0NUUkxfU1Q7CisJb21hcF9kbV90aW1lcl93cml0ZV9yZWcodGltZXIsIE9NQVBfVElNRVJfQ1RSTF9SRUcsIGwpOworfQorCit2b2lkIG9tYXBfZG1fdGltZXJfc3RvcChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIpCit7CisJdTMyIGw7CisKKwlsID0gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRyk7CisJbCAmPSB+MHgxOworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHLCBsKTsKK30KKwordW5zaWduZWQgaW50IG9tYXBfZG1fdGltZXJfcmVhZF9jb3VudGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwlyZXR1cm4gb21hcF9kbV90aW1lcl9yZWFkX3JlZyh0aW1lciwgT01BUF9USU1FUl9DT1VOVEVSX1JFRyk7Cit9CisKK3ZvaWQgb21hcF9kbV90aW1lcl9yZXNldF9jb3VudGVyKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DT1VOVEVSX1JFRywgMCk7Cit9CisKK3ZvaWQgb21hcF9kbV90aW1lcl9zZXRfbG9hZChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCBsb2FkKQoreworCW9tYXBfZG1fdGltZXJfd3JpdGVfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0xPQURfUkVHLCBsb2FkKTsKK30KKwordm9pZCBvbWFwX2RtX3RpbWVyX3NldF9tYXRjaChzdHJ1Y3Qgb21hcF9kbV90aW1lciAqdGltZXIsIHVuc2lnbmVkIGludCBtYXRjaCkKK3sKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9NQVRDSF9SRUcsIG1hdGNoKTsKK30KKwordm9pZCBvbWFwX2RtX3RpbWVyX2VuYWJsZV9jb21wYXJlKHN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcikKK3sKKwl1MzIgbDsKKworCWwgPSBvbWFwX2RtX3RpbWVyX3JlYWRfcmVnKHRpbWVyLCBPTUFQX1RJTUVSX0NUUkxfUkVHKTsKKwlsIHw9IE9NQVBfVElNRVJfQ1RSTF9DRTsKKwlvbWFwX2RtX3RpbWVyX3dyaXRlX3JlZyh0aW1lciwgT01BUF9USU1FUl9DVFJMX1JFRywgbCk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIF9fZG1fdGltZXJfaW5pdCh2b2lkKQoreworCXN0cnVjdCBvbWFwX2RtX3RpbWVyICp0aW1lcjsKKworCXNwaW5fbG9ja19pbml0KCZkbV90aW1lcl9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmZG1fdGltZXJfaW5mby51bnVzZWRfdGltZXJzKTsKKwlJTklUX0xJU1RfSEVBRCgmZG1fdGltZXJfaW5mby5yZXNlcnZlZF90aW1lcnMpOworCisJdGltZXIgPSAmZG1fdGltZXJzWzBdOworCXdoaWxlICh0aW1lci0+YmFzZSkgeworCQlsaXN0X2FkZF90YWlsKChzdHJ1Y3QgbGlzdF9oZWFkICopdGltZXIsICZkbV90aW1lcl9pbmZvLnVudXNlZF90aW1lcnMpOworCQlvbWFwX2RtX3RpbWVyX3Jlc2V0KHRpbWVyKTsKKwkJdGltZXIrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfZG1fdGltZXJfaW5pdCh2b2lkKQoreworCWlmIChjcHVfaXNfb21hcDE2eHgoKSkKKwkJX19kbV90aW1lcl9pbml0KCk7CisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwob21hcF9kbV90aW1lcl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvZ3Bpby5jCmluZGV4IGFhNDgxZWEuLjU1MDU5YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9ncGlvLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2dwaW8uYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBTdXBwb3J0IGZ1bmN0aW9ucyBmb3IgT01BUCBHUElPCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAzIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgogICogV3JpdHRlbiBieSBKdWhhIFlyavZs5CA8anVoYS55cmpvbGFAbm9raWEuY29tPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC0xNyw4ICsxNywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KQEAgLTI5LDcgKzMyLDcgQEAKIC8qCiAgKiBPTUFQMTUxMCBHUElPIHJlZ2lzdGVycwogICovCi0jZGVmaW5lIE9NQVAxNTEwX0dQSU9fQkFTRQkJMHhmZmZjZTAwMAorI2RlZmluZSBPTUFQMTUxMF9HUElPX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmNlMDAwCiAjZGVmaW5lIE9NQVAxNTEwX0dQSU9fREFUQV9JTlBVVAkweDAwCiAjZGVmaW5lIE9NQVAxNTEwX0dQSU9fREFUQV9PVVRQVVQJMHgwNAogI2RlZmluZSBPTUFQMTUxMF9HUElPX0RJUl9DT05UUk9MCTB4MDgKQEAgLTQzLDM0ICs0NiwzNyBAQAogLyoKICAqIE9NQVAxNjEwIHNwZWNpZmljIEdQSU8gcmVnaXN0ZXJzCiAgKi8KLSNkZWZpbmUgT01BUDE2MTBfR1BJTzFfQkFTRQkJMHhmZmZiZTQwMAotI2RlZmluZSBPTUFQMTYxMF9HUElPMl9CQVNFCQkweGZmZmJlYzAwCi0jZGVmaW5lIE9NQVAxNjEwX0dQSU8zX0JBU0UJCTB4ZmZmYmI0MDAKLSNkZWZpbmUgT01BUDE2MTBfR1BJTzRfQkFTRQkJMHhmZmZiYmMwMAorI2RlZmluZSBPTUFQMTYxMF9HUElPMV9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZTQwMAorI2RlZmluZSBPTUFQMTYxMF9HUElPMl9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZWMwMAorI2RlZmluZSBPTUFQMTYxMF9HUElPM19CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiYjQwMAorI2RlZmluZSBPTUFQMTYxMF9HUElPNF9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiYmMwMAogI2RlZmluZSBPTUFQMTYxMF9HUElPX1JFVklTSU9OCQkweDAwMDAKICNkZWZpbmUgT01BUDE2MTBfR1BJT19TWVNDT05GSUcJCTB4MDAxMAogI2RlZmluZSBPTUFQMTYxMF9HUElPX1NZU1NUQVRVUwkJMHgwMDE0CiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fSVJRU1RBVFVTMQkweDAwMTgKICNkZWZpbmUgT01BUDE2MTBfR1BJT19JUlFFTkFCTEUxCTB4MDAxYworI2RlZmluZSBPTUFQMTYxMF9HUElPX1dBS0VVUEVOQUJMRQkweDAwMjgKICNkZWZpbmUgT01BUDE2MTBfR1BJT19EQVRBSU4JCTB4MDAyYwogI2RlZmluZSBPTUFQMTYxMF9HUElPX0RBVEFPVVQJCTB4MDAzMAogI2RlZmluZSBPTUFQMTYxMF9HUElPX0RJUkVDVElPTgkJMHgwMDM0CiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMQkweDAwMzgKICNkZWZpbmUgT01BUDE2MTBfR1BJT19FREdFX0NUUkwyCTB4MDAzYwogI2RlZmluZSBPTUFQMTYxMF9HUElPX0NMRUFSX0lSUUVOQUJMRTEJMHgwMDljCisjZGVmaW5lIE9NQVAxNjEwX0dQSU9fQ0xFQVJfV0FLRVVQRU5BCTB4MDBhOAogI2RlZmluZSBPTUFQMTYxMF9HUElPX0NMRUFSX0RBVEFPVVQJMHgwMGIwCiAjZGVmaW5lIE9NQVAxNjEwX0dQSU9fU0VUX0lSUUVOQUJMRTEJMHgwMGRjCisjZGVmaW5lIE9NQVAxNjEwX0dQSU9fU0VUX1dBS0VVUEVOQQkweDAwZTgKICNkZWZpbmUgT01BUDE2MTBfR1BJT19TRVRfREFUQU9VVAkweDAwZjAKIAogLyoKICAqIE9NQVA3MzAgc3BlY2lmaWMgR1BJTyByZWdpc3RlcnMKICAqLwotI2RlZmluZSBPTUFQNzMwX0dQSU8xX0JBU0UJCTB4ZmZmYmMwMDAKLSNkZWZpbmUgT01BUDczMF9HUElPMl9CQVNFCQkweGZmZmJjODAwCi0jZGVmaW5lIE9NQVA3MzBfR1BJTzNfQkFTRQkJMHhmZmZiZDAwMAotI2RlZmluZSBPTUFQNzMwX0dQSU80X0JBU0UJCTB4ZmZmYmQ4MDAKLSNkZWZpbmUgT01BUDczMF9HUElPNV9CQVNFCQkweGZmZmJlMDAwCi0jZGVmaW5lIE9NQVA3MzBfR1BJTzZfQkFTRQkJMHhmZmZiZTgwMAorI2RlZmluZSBPTUFQNzMwX0dQSU8xX0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJjMDAwCisjZGVmaW5lIE9NQVA3MzBfR1BJTzJfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmM4MDAKKyNkZWZpbmUgT01BUDczMF9HUElPM19CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZDAwMAorI2RlZmluZSBPTUFQNzMwX0dQSU80X0JBU0UJCSh2b2lkIF9faW9tZW0gKikweGZmZmJkODAwCisjZGVmaW5lIE9NQVA3MzBfR1BJTzVfQkFTRQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYmUwMDAKKyNkZWZpbmUgT01BUDczMF9HUElPNl9CQVNFCQkodm9pZCBfX2lvbWVtICopMHhmZmZiZTgwMAogI2RlZmluZSBPTUFQNzMwX0dQSU9fREFUQV9JTlBVVAkJMHgwMAogI2RlZmluZSBPTUFQNzMwX0dQSU9fREFUQV9PVVRQVVQJMHgwNAogI2RlZmluZSBPTUFQNzMwX0dQSU9fRElSX0NPTlRST0wJMHgwOApAQCAtNzgsMTQgKzg0LDQzIEBACiAjZGVmaW5lIE9NQVA3MzBfR1BJT19JTlRfTUFTSwkJMHgxMAogI2RlZmluZSBPTUFQNzMwX0dQSU9fSU5UX1NUQVRVUwkJMHgxNAogCisvKgorICogb21hcDI0eHggc3BlY2lmaWMgR1BJTyByZWdpc3RlcnMKKyAqLworI2RlZmluZSBPTUFQMjRYWF9HUElPMV9CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxODAwMAorI2RlZmluZSBPTUFQMjRYWF9HUElPMl9CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxYTAwMAorI2RlZmluZSBPTUFQMjRYWF9HUElPM19CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxYzAwMAorI2RlZmluZSBPTUFQMjRYWF9HUElPNF9CQVNFCQkodm9pZCBfX2lvbWVtICopMHg0ODAxZTAwMAorI2RlZmluZSBPTUFQMjRYWF9HUElPX1JFVklTSU9OCQkweDAwMDAKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19TWVNDT05GSUcJCTB4MDAxMAorI2RlZmluZSBPTUFQMjRYWF9HUElPX1NZU1NUQVRVUwkJMHgwMDE0CisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fSVJRU1RBVFVTMQkweDAwMTgKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19JUlFFTkFCTEUxCTB4MDAxYworI2RlZmluZSBPTUFQMjRYWF9HUElPX0NUUkwJCTB4MDAzMAorI2RlZmluZSBPTUFQMjRYWF9HUElPX09FCQkweDAwMzQKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19EQVRBSU4JCTB4MDAzOAorI2RlZmluZSBPTUFQMjRYWF9HUElPX0RBVEFPVVQJCTB4MDAzYworI2RlZmluZSBPTUFQMjRYWF9HUElPX0xFVkVMREVURUNUMAkweDAwNDAKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19MRVZFTERFVEVDVDEJMHgwMDQ0CisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fUklTSU5HREVURUNUCTB4MDA0OAorI2RlZmluZSBPTUFQMjRYWF9HUElPX0ZBTExJTkdERVRFQ1QJMHgwMDRjCisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fQ0xFQVJJUlFFTkFCTEUxCTB4MDA2MAorI2RlZmluZSBPTUFQMjRYWF9HUElPX1NFVElSUUVOQUJMRTEJMHgwMDY0CisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fQ0xFQVJXS1VFTkEJMHgwMDgwCisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fU0VUV0tVRU5BCQkweDAwODQKKyNkZWZpbmUgT01BUDI0WFhfR1BJT19DTEVBUkRBVEFPVVQJMHgwMDkwCisjZGVmaW5lIE9NQVAyNFhYX0dQSU9fU0VUREFUQU9VVAkweDAwOTQKKwogI2RlZmluZSBPTUFQX01QVUlPX01BU0sJCSh+T01BUF9NQVhfR1BJT19MSU5FUyAmIDB4ZmYpCiAKIHN0cnVjdCBncGlvX2JhbmsgewotCXUzMiBiYXNlOworCXZvaWQgX19pb21lbSAqYmFzZTsKIAl1MTYgaXJxOwogCXUxNiB2aXJ0dWFsX2lycV9zdGFydDsKLQl1OCBtZXRob2Q7CisJaW50IG1ldGhvZDsKIAl1MzIgcmVzZXJ2ZWRfbWFwOworCXUzMiBzdXNwZW5kX3dha2V1cDsKKwl1MzIgc2F2ZWRfd2FrZXVwOwogCXNwaW5sb2NrX3QgbG9jazsKIH07CiAKQEAgLTkzLDggKzEyOCw5IEBACiAjZGVmaW5lIE1FVEhPRF9HUElPXzE1MTAJMQogI2RlZmluZSBNRVRIT0RfR1BJT18xNjEwCTIKICNkZWZpbmUgTUVUSE9EX0dQSU9fNzMwCQkzCisjZGVmaW5lIE1FVEhPRF9HUElPXzI0WFgJNAogCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQMTZYWCkKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAogc3RhdGljIHN0cnVjdCBncGlvX2JhbmsgZ3Bpb19iYW5rXzE2MTBbNV0gPSB7CiAJeyBPTUFQX01QVUlPX0JBU0UsICAgICBJTlRfTVBVSU8sCSAgICBJSF9NUFVJT19CQVNFLCAgICAgTUVUSE9EX01QVUlPfSwKIAl7IE9NQVAxNjEwX0dQSU8xX0JBU0UsIElOVF9HUElPX0JBTksxLAkgICAgSUhfR1BJT19CQVNFLCAgICAgIE1FVEhPRF9HUElPXzE2MTAgfSwKQEAgLTEyMyw2ICsxNTksMTUgQEAKIH07CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNFhYCitzdGF0aWMgc3RydWN0IGdwaW9fYmFuayBncGlvX2JhbmtfMjR4eFs0XSA9IHsKKwl7IE9NQVAyNFhYX0dQSU8xX0JBU0UsIElOVF8yNFhYX0dQSU9fQkFOSzEsIElIX0dQSU9fQkFTRSwJTUVUSE9EX0dQSU9fMjRYWCB9LAorCXsgT01BUDI0WFhfR1BJTzJfQkFTRSwgSU5UXzI0WFhfR1BJT19CQU5LMiwgSUhfR1BJT19CQVNFICsgMzIsCU1FVEhPRF9HUElPXzI0WFggfSwKKwl7IE9NQVAyNFhYX0dQSU8zX0JBU0UsIElOVF8yNFhYX0dQSU9fQkFOSzMsIElIX0dQSU9fQkFTRSArIDY0LAlNRVRIT0RfR1BJT18yNFhYIH0sCisJeyBPTUFQMjRYWF9HUElPNF9CQVNFLCBJTlRfMjRYWF9HUElPX0JBTks0LCBJSF9HUElPX0JBU0UgKyA5NiwJTUVUSE9EX0dQSU9fMjRYWCB9LAorfTsKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IGdwaW9fYmFuayAqZ3Bpb19iYW5rOwogc3RhdGljIGludCBncGlvX2JhbmtfY291bnQ7CiAKQEAgLTE0OSwxNCArMTk0LDIzIEBACiAJCXJldHVybiAmZ3Bpb19iYW5rWzEgKyAoZ3BpbyA+PiA1KV07CiAJfQogI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKwlpZiAoY3B1X2lzX29tYXAyNHh4KCkpCisJCXJldHVybiAmZ3Bpb19iYW5rW2dwaW8gPj4gNV07CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZ2V0X2dwaW9faW5kZXgoaW50IGdwaW8pCiB7CisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDczMAogCWlmIChjcHVfaXNfb21hcDczMCgpKQogCQlyZXR1cm4gZ3BpbyAmIDB4MWY7Ci0JZWxzZQotCQlyZXR1cm4gZ3BpbyAmIDB4MGY7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAorCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKKwkJcmV0dXJuIGdwaW8gJiAweDFmOworI2VuZGlmCisJcmV0dXJuIGdwaW8gJiAweDBmOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBncGlvX3ZhbGlkKGludCBncGlvKQpAQCAtMTgwLDYgKzIzNCwxMCBAQAogCWlmIChjcHVfaXNfb21hcDczMCgpICYmIGdwaW8gPCAxOTIpCiAJCXJldHVybiAwOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKwlpZiAoY3B1X2lzX29tYXAyNHh4KCkgJiYgZ3BpbyA8IDEyOCkKKwkJcmV0dXJuIDA7CisjZW5kaWYKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTE5NSw3ICsyNTMsNyBAQAogCiBzdGF0aWMgdm9pZCBfc2V0X2dwaW9fZGlyZWN0aW9uKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgaXNfaW5wdXQpCiB7Ci0JdTMyIHJlZyA9IGJhbmstPmJhc2U7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOwogCXUzMiBsOwogCiAJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKQEAgLTIxMSw2ICsyNjksOSBAQAogCWNhc2UgTUVUSE9EX0dQSU9fNzMwOgogCQlyZWcgKz0gT01BUDczMF9HUElPX0RJUl9DT05UUk9MOwogCQlicmVhazsKKwljYXNlIE1FVEhPRF9HUElPXzI0WFg6CisJCXJlZyArPSBPTUFQMjRYWF9HUElPX09FOworCQlicmVhazsKIAl9CiAJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CiAJaWYgKGlzX2lucHV0KQpAQCAtMjM0LDcgKzI5NSw3IEBACiAKIHN0YXRpYyB2b2lkIF9zZXRfZ3Bpb19kYXRhb3V0KHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgZW5hYmxlKQogewotCXUzMiByZWcgPSBiYW5rLT5iYXNlOworCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZTsKIAl1MzIgbCA9IDA7CiAKIAlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewpAQCAtMjY5LDYgKzMzMCwxMyBAQAogCQllbHNlCiAJCQlsICY9IH4oMSA8PCBncGlvKTsKIAkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgorCQlpZiAoZW5hYmxlKQorCQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fU0VUREFUQU9VVDsKKwkJZWxzZQorCQkJcmVnICs9IE9NQVAyNFhYX0dQSU9fQ0xFQVJEQVRBT1VUOworCQlsID0gMSA8PCBncGlvOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAkJcmV0dXJuOwpAQCAtMjkxLDcgKzM1OSw3IEBACiBpbnQgb21hcF9nZXRfZ3Bpb19kYXRhaW4oaW50IGdwaW8pCiB7CiAJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKLQl1MzIgcmVnOworCXZvaWQgX19pb21lbSAqcmVnOwogCiAJaWYgKGNoZWNrX2dwaW8oZ3BpbykgPCAwKQogCQlyZXR1cm4gLTE7CkBAIC0zMTAsMTA5ICszNzgsMTMyIEBACiAJY2FzZSBNRVRIT0RfR1BJT183MzA6CiAJCXJlZyArPSBPTUFQNzMwX0dQSU9fREFUQV9JTlBVVDsKIAkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgorCQlyZWcgKz0gT01BUDI0WFhfR1BJT19EQVRBSU47CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCQlyZXR1cm4gLTE7CiAJfQotCXJldHVybiAoX19yYXdfcmVhZGwocmVnKSAmICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKSkgIT0gMDsKKwlyZXR1cm4gKF9fcmF3X3JlYWRsKHJlZykKKwkJCSYgKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpKSAhPSAwOwogfQogCi1zdGF0aWMgdm9pZCBfc2V0X2dwaW9fZWRnZV9jdHJsKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgZWRnZSkKKyNkZWZpbmUgTU9EX1JFR19CSVQocmVnLCBiaXRfbWFzaywgc2V0KQlcCitkbyB7CVwKKwlpbnQgbCA9IF9fcmF3X3JlYWRsKGJhc2UgKyByZWcpOyBcCisJaWYgKHNldCkgbCB8PSBiaXRfbWFzazsgXAorCWVsc2UgbCAmPSB+Yml0X21hc2s7IFwKKwlfX3Jhd193cml0ZWwobCwgYmFzZSArIHJlZyk7IFwKK30gd2hpbGUoMCkKKworc3RhdGljIGlubGluZSB2b2lkIHNldF8yNHh4X2dwaW9fdHJpZ2dlcmluZyh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBncGlvLCBpbnQgdHJpZ2dlcikKIHsKLQl1MzIgcmVnID0gYmFuay0+YmFzZTsKLQl1MzIgbDsKKwl1MzIgZ3Bpb19iaXQgPSAxIDw8IGdwaW87CisKKwlNT0RfUkVHX0JJVChPTUFQMjRYWF9HUElPX0xFVkVMREVURUNUMCwgZ3Bpb19iaXQsCisJCXRyaWdnZXIgJiBJUlFUX0xPVyk7CisJTU9EX1JFR19CSVQoT01BUDI0WFhfR1BJT19MRVZFTERFVEVDVDEsIGdwaW9fYml0LAorCQl0cmlnZ2VyICYgSVJRVF9ISUdIKTsKKwlNT0RfUkVHX0JJVChPTUFQMjRYWF9HUElPX1JJU0lOR0RFVEVDVCwgZ3Bpb19iaXQsCisJCXRyaWdnZXIgJiBJUlFUX1JJU0lORyk7CisJTU9EX1JFR19CSVQoT01BUDI0WFhfR1BJT19GQUxMSU5HREVURUNULCBncGlvX2JpdCwKKwkJdHJpZ2dlciAmIElSUVRfRkFMTElORyk7CisJLyogRklYTUU6IFBvc3NpYmx5IGRvICdzZXRfaXJxX2hhbmRsZXIoaiwgZG9fbGV2ZWxfSVJRKScgaWYgb25seSBsZXZlbAorCSAqIHRyaWdnZXJpbmcgcmVxdWVzdGVkLiAqLworfQorCitzdGF0aWMgaW50IF9zZXRfZ3Bpb190cmlnZ2VyaW5nKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvLCBpbnQgdHJpZ2dlcikKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2U7CisJdTMyIGwgPSAwOwogCiAJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKIAljYXNlIE1FVEhPRF9NUFVJTzoKIAkJcmVnICs9IE9NQVBfTVBVSU9fR1BJT19JTlRfRURHRTsKIAkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JCWlmIChlZGdlID09IE9NQVBfR1BJT19SSVNJTkdfRURHRSkKKwkJaWYgKHRyaWdnZXIgPT0gSVJRVF9SSVNJTkcpCiAJCQlsIHw9IDEgPDwgZ3BpbzsKLQkJZWxzZQorCQllbHNlIGlmICh0cmlnZ2VyID09IElSUVRfRkFMTElORykKIAkJCWwgJj0gfigxIDw8IGdwaW8pOwotCQlfX3Jhd193cml0ZWwobCwgcmVnKTsKKwkJZWxzZQorCQkJZ290byBiYWQ7CiAJCWJyZWFrOwogCWNhc2UgTUVUSE9EX0dQSU9fMTUxMDoKIAkJcmVnICs9IE9NQVAxNTEwX0dQSU9fSU5UX0NPTlRST0w7CiAJCWwgPSBfX3Jhd19yZWFkbChyZWcpOwotCQlpZiAoZWRnZSA9PSBPTUFQX0dQSU9fUklTSU5HX0VER0UpCisJCWlmICh0cmlnZ2VyID09IElSUVRfUklTSU5HKQogCQkJbCB8PSAxIDw8IGdwaW87Ci0JCWVsc2UKKwkJZWxzZSBpZiAodHJpZ2dlciA9PSBJUlFUX0ZBTExJTkcpCiAJCQlsICY9IH4oMSA8PCBncGlvKTsKLQkJX19yYXdfd3JpdGVsKGwsIHJlZyk7CisJCWVsc2UKKwkJCWdvdG8gYmFkOwogCQlicmVhazsKIAljYXNlIE1FVEhPRF9HUElPXzE2MTA6Ci0JCWVkZ2UgJj0gMHgwMzsKIAkJaWYgKGdwaW8gJiAweDA4KQogCQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMjsKIAkJZWxzZQogCQkJcmVnICs9IE9NQVAxNjEwX0dQSU9fRURHRV9DVFJMMTsKIAkJZ3BpbyAmPSAweDA3OworCQkvKiBXZSBhbGxvdyBvbmx5IGVkZ2UgdHJpZ2dlcmluZywgaS5lLiB0d28gbG93ZXN0IGJpdHMgKi8KKwkJaWYgKHRyaWdnZXIgJiB+SVJRVF9CT1RIRURHRSkKKwkJCUJVRygpOworCQkvKiBOT1RFOiBrbm93cyBfX0lSUVRfe0ZBTCxSSVN9RURHRSBtYXRjaCBPTUFQIGhhcmR3YXJlICovCisJCXRyaWdnZXIgJj0gMHgwMzsKIAkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7CiAJCWwgJj0gfigzIDw8IChncGlvIDw8IDEpKTsKLQkJbCB8PSBlZGdlIDw8IChncGlvIDw8IDEpOwotCQlfX3Jhd193cml0ZWwobCwgcmVnKTsKKwkJbCB8PSB0cmlnZ2VyIDw8IChncGlvIDw8IDEpOwogCQlicmVhazsKIAljYXNlIE1FVEhPRF9HUElPXzczMDoKIAkJcmVnICs9IE9NQVA3MzBfR1BJT19JTlRfQ09OVFJPTDsKIAkJbCA9IF9fcmF3X3JlYWRsKHJlZyk7Ci0JCWlmIChlZGdlID09IE9NQVBfR1BJT19SSVNJTkdfRURHRSkKKwkJaWYgKHRyaWdnZXIgPT0gSVJRVF9SSVNJTkcpCiAJCQlsIHw9IDEgPDwgZ3BpbzsKLQkJZWxzZQorCQllbHNlIGlmICh0cmlnZ2VyID09IElSUVRfRkFMTElORykKIAkJCWwgJj0gfigxIDw8IGdwaW8pOwotCQlfX3Jhd193cml0ZWwobCwgcmVnKTsKKwkJZWxzZQorCQkJZ290byBiYWQ7CisJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKKwkJc2V0XzI0eHhfZ3Bpb190cmlnZ2VyaW5nKHJlZywgZ3BpbywgdHJpZ2dlcik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwotCQlyZXR1cm47CisJCWdvdG8gYmFkOwogCX0KKwlfX3Jhd193cml0ZWwobCwgcmVnKTsKKwlyZXR1cm4gMDsKK2JhZDoKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAotdm9pZCBvbWFwX3NldF9ncGlvX2VkZ2VfY3RybChpbnQgZ3BpbywgaW50IGVkZ2UpCitzdGF0aWMgaW50IGdwaW9faXJxX3R5cGUodW5zaWduZWQgaXJxLCB1bnNpZ25lZCB0eXBlKQogewogCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CisJdW5zaWduZWQgZ3BpbzsKKwlpbnQgcmV0dmFsOworCisJaWYgKGlycSA+IElIX01QVUlPX0JBU0UpCisJCWdwaW8gPSBPTUFQX01QVUlPKGlycSAtIElIX01QVUlPX0JBU0UpOworCWVsc2UKKwkJZ3BpbyA9IGlycSAtIElIX0dQSU9fQkFTRTsKIAogCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0eXBlICYgKF9fSVJRVF9MT1dMVkx8X19JUlFUX0hJR0hMVkx8SVJRVF9QUk9CRSkpCisJCXJldHVybiAtRUlOVkFMOworCiAJYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CiAJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKLQlfc2V0X2dwaW9fZWRnZV9jdHJsKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCBlZGdlKTsKKwlyZXR2YWwgPSBfc2V0X2dwaW9fdHJpZ2dlcmluZyhiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgdHlwZSk7CiAJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwotfQotCi0KLXN0YXRpYyBpbnQgX2dldF9ncGlvX2VkZ2VfY3RybChzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbykKLXsKLQl1MzIgcmVnID0gYmFuay0+YmFzZSwgbDsKLQotCXN3aXRjaCAoYmFuay0+bWV0aG9kKSB7Ci0JY2FzZSBNRVRIT0RfTVBVSU86Ci0JCWwgPSBfX3Jhd19yZWFkbChyZWcgKyBPTUFQX01QVUlPX0dQSU9fSU5UX0VER0UpOwotCQlyZXR1cm4gKGwgJiAoMSA8PCBncGlvKSkgPwotCQkJT01BUF9HUElPX1JJU0lOR19FREdFIDogT01BUF9HUElPX0ZBTExJTkdfRURHRTsKLQljYXNlIE1FVEhPRF9HUElPXzE1MTA6Ci0JCWwgPSBfX3Jhd19yZWFkbChyZWcgKyBPTUFQMTUxMF9HUElPX0lOVF9DT05UUk9MKTsKLQkJcmV0dXJuIChsICYgKDEgPDwgZ3BpbykpID8KLQkJCU9NQVBfR1BJT19SSVNJTkdfRURHRSA6IE9NQVBfR1BJT19GQUxMSU5HX0VER0U7Ci0JY2FzZSBNRVRIT0RfR1BJT18xNjEwOgotCQlpZiAoZ3BpbyAmIDB4MDgpCi0JCQlyZWcgKz0gT01BUDE2MTBfR1BJT19FREdFX0NUUkwyOwotCQllbHNlCi0JCQlyZWcgKz0gT01BUDE2MTBfR1BJT19FREdFX0NUUkwxOwotCQlyZXR1cm4gKF9fcmF3X3JlYWRsKHJlZykgPj4gKChncGlvICYgMHgwNykgPDwgMSkpICYgMHgwMzsKLQljYXNlIE1FVEhPRF9HUElPXzczMDoKLQkJbCA9IF9fcmF3X3JlYWRsKHJlZyArIE9NQVA3MzBfR1BJT19JTlRfQ09OVFJPTCk7Ci0JCXJldHVybiAobCAmICgxIDw8IGdwaW8pKSA/Ci0JCQlPTUFQX0dQSU9fUklTSU5HX0VER0UgOiBPTUFQX0dQSU9fRkFMTElOR19FREdFOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCQlyZXR1cm4gLTE7Ci0JfQorCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIF9jbGVhcl9ncGlvX2lycWJhbmsoc3RydWN0IGdwaW9fYmFuayAqYmFuaywgaW50IGdwaW9fbWFzaykKIHsKLQl1MzIgcmVnID0gYmFuay0+YmFzZTsKKwl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2U7CiAKIAlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgewogCWNhc2UgTUVUSE9EX01QVUlPOgpAQCAtNDI4LDYgKzUxOSw5IEBACiAJY2FzZSBNRVRIT0RfR1BJT183MzA6CiAJCXJlZyArPSBPTUFQNzMwX0dQSU9fSU5UX1NUQVRVUzsKIAkJYnJlYWs7CisJY2FzZSBNRVRIT0RfR1BJT18yNFhYOgorCQlyZWcgKz0gT01BUDI0WFhfR1BJT19JUlFTVEFUVVMxOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAkJcmV0dXJuOwpAQCAtNDQyLDcgKzUzNiw3IEBACiAKIHN0YXRpYyB2b2lkIF9lbmFibGVfZ3Bpb19pcnFiYW5rKHN0cnVjdCBncGlvX2JhbmsgKmJhbmssIGludCBncGlvX21hc2ssIGludCBlbmFibGUpCiB7Ci0JdTMyIHJlZyA9IGJhbmstPmJhc2U7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlOwogCXUzMiBsOwogCiAJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKQEAgLTQ3Nyw2ICs1NzEsMTMgQEAKIAkJZWxzZQogCQkJbCB8PSBncGlvX21hc2s7CiAJCWJyZWFrOworCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKKwkJaWYgKGVuYWJsZSkKKwkJCXJlZyArPSBPTUFQMjRYWF9HUElPX1NFVElSUUVOQUJMRTE7CisJCWVsc2UKKwkJCXJlZyArPSBPTUFQMjRYWF9HUElPX0NMRUFSSVJRRU5BQkxFMTsKKwkJbCA9IGdwaW9fbWFzazsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJCXJldHVybjsKQEAgLTQ4OSw2ICs1OTAsNTAgQEAKIAlfZW5hYmxlX2dwaW9faXJxYmFuayhiYW5rLCAxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pLCBlbmFibGUpOwogfQogCisvKgorICogTm90ZSB0aGF0IEVOQVdBS0VVUCBuZWVkcyB0byBiZSBlbmFibGVkIGluIEdQSU9fU1lTQ09ORklHIHJlZ2lzdGVyLgorICogMTUxMCBkb2VzIG5vdCBzZWVtIHRvIGhhdmUgYSB3YWtlLXVwIHJlZ2lzdGVyLiBJZiBKVEFHIGlzIGNvbm5lY3RlZAorICogdG8gdGhlIHRhcmdldCwgc3lzdGVtIHdpbGwgd2FrZSB1cCBhbHdheXMgb24gR1BJTyBldmVudHMuIFdoaWxlCisgKiBzeXN0ZW0gaXMgcnVubmluZyBhbGwgcmVnaXN0ZXJlZCBHUElPIGludGVycnVwdHMgbmVlZCB0byBoYXZlIHdha2UtdXAKKyAqIGVuYWJsZWQuIFdoZW4gc3lzdGVtIGlzIHN1c3BlbmRlZCwgb25seSBzZWxlY3RlZCBHUElPIGludGVycnVwdHMgbmVlZAorICogdG8gaGF2ZSB3YWtlLXVwIGVuYWJsZWQuCisgKi8KK3N0YXRpYyBpbnQgX3NldF9ncGlvX3dha2V1cChzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rLCBpbnQgZ3BpbywgaW50IGVuYWJsZSkKK3sKKwlzd2l0Y2ggKGJhbmstPm1ldGhvZCkgeworCWNhc2UgTUVUSE9EX0dQSU9fMTYxMDoKKwljYXNlIE1FVEhPRF9HUElPXzI0WFg6CisJCXNwaW5fbG9jaygmYmFuay0+bG9jayk7CisJCWlmIChlbmFibGUpCisJCQliYW5rLT5zdXNwZW5kX3dha2V1cCB8PSAoMSA8PCBncGlvKTsKKwkJZWxzZQorCQkJYmFuay0+c3VzcGVuZF93YWtldXAgJj0gfigxIDw8IGdwaW8pOworCQlzcGluX3VubG9jaygmYmFuay0+bG9jayk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZW5hYmxlIEdQSU8gd2FrZXVwIGZvciBtZXRob2QgJWlcbiIsCisJCSAgICAgICBiYW5rLT5tZXRob2QpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKy8qIFVzZSBkaXNhYmxlX2lycV93YWtlKCkgYW5kIGVuYWJsZV9pcnFfd2FrZSgpIGZ1bmN0aW9ucyBmcm9tIGRyaXZlcnMgKi8KK3N0YXRpYyBpbnQgZ3Bpb193YWtlX2VuYWJsZSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkIGludCBncGlvID0gaXJxIC0gSUhfR1BJT19CQVNFOworCXN0cnVjdCBncGlvX2JhbmsgKmJhbms7CisJaW50IHJldHZhbDsKKworCWlmIChjaGVja19ncGlvKGdwaW8pIDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJYmFuayA9IGdldF9ncGlvX2JhbmsoZ3Bpbyk7CisJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKKwlyZXR2YWwgPSBfc2V0X2dwaW9fd2FrZXVwKGJhbmssIGdldF9ncGlvX2luZGV4KGdwaW8pLCBlbmFibGUpOworCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKIGludCBvbWFwX3JlcXVlc3RfZ3BpbyhpbnQgZ3BpbykKIHsKIAlzdHJ1Y3QgZ3Bpb19iYW5rICpiYW5rOwpAQCAtNTA1LDE1ICs2NTAsMzMgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAliYW5rLT5yZXNlcnZlZF9tYXAgfD0gKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbykpOworCisJLyogU2V0IHRyaWdnZXIgdG8gbm9uZS4gWW91IG5lZWQgdG8gZW5hYmxlIHRoZSB0cmlnZ2VyIGFmdGVyIHJlcXVlc3RfaXJxICovCisJX3NldF9ncGlvX3RyaWdnZXJpbmcoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIElSUVRfTk9FREdFKTsKKwogI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNTEwCiAJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT18xNTEwKSB7Ci0JCXUzMiByZWc7CisJCXZvaWQgX19pb21lbSAqcmVnOwogCi0JCS8qIENsYWltIHRoZSBwaW4gZm9yIHRoZSBBUk0gKi8KKwkJLyogQ2xhaW0gdGhlIHBpbiBmb3IgTVBVICovCiAJCXJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMTUxMF9HUElPX1BJTl9DT05UUk9MOwogCQlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwocmVnKSB8ICgxIDw8IGdldF9ncGlvX2luZGV4KGdwaW8pKSwgcmVnKTsKIAl9CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAorCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTYxMCkgeworCQkvKiBFbmFibGUgd2FrZS11cCBkdXJpbmcgaWRsZSBmb3IgZHluYW1pYyB0aWNrICovCisJCXZvaWQgX19pb21lbSAqcmVnID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fU0VUX1dBS0VVUEVOQTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIHJlZyk7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKwlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzI0WFgpIHsKKwkJLyogRW5hYmxlIHdha2UtdXAgZHVyaW5nIGlkbGUgZm9yIGR5bmFtaWMgdGljayAqLworCQl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX1NFVFdLVUVOQTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIHJlZyk7CisJfQorI2VuZGlmCiAJc3Bpbl91bmxvY2soJmJhbmstPmxvY2spOwogCiAJcmV0dXJuIDA7CkBAIC01MzMsNiArNjk2LDIwIEBACiAJCXNwaW5fdW5sb2NrKCZiYW5rLT5sb2NrKTsKIAkJcmV0dXJuOwogCX0KKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMTZYWAorCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMTYxMCkgeworCQkvKiBEaXNhYmxlIHdha2UtdXAgZHVyaW5nIGlkbGUgZm9yIGR5bmFtaWMgdGljayAqLworCQl2b2lkIF9faW9tZW0gKnJlZyA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0NMRUFSX1dBS0VVUEVOQTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIHJlZyk7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKwlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzI0WFgpIHsKKwkJLyogRGlzYWJsZSB3YWtlLXVwIGR1cmluZyBpZGxlIGZvciBkeW5hbWljIHRpY2sgKi8KKwkJdm9pZCBfX2lvbWVtICpyZWcgPSBiYW5rLT5iYXNlICsgT01BUDI0WFhfR1BJT19DTEVBUldLVUVOQTsKKwkJX19yYXdfd3JpdGVsKDEgPDwgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIHJlZyk7CisJfQorI2VuZGlmCiAJYmFuay0+cmVzZXJ2ZWRfbWFwICY9IH4oMSA8PCBnZXRfZ3Bpb19pbmRleChncGlvKSk7CiAJX3NldF9ncGlvX2RpcmVjdGlvbihiYW5rLCBnZXRfZ3Bpb19pbmRleChncGlvKSwgMSk7CiAJX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvLCAwKTsKQEAgLTU1Miw3ICs3MjksNyBAQAogc3RhdGljIHZvaWQgZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxZGVzYyAqZGVzYywKIAkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JdTMyIGlzcl9yZWcgPSAwOworCXZvaWQgX19pb21lbSAqaXNyX3JlZyA9IE5VTEw7CiAJdTMyIGlzcjsKIAl1bnNpZ25lZCBpbnQgZ3Bpb19pcnE7CiAJc3RydWN0IGdwaW9fYmFuayAqYmFuazsKQEAgLTU3NCwyNCArNzUxLDMwIEBACiAJaWYgKGJhbmstPm1ldGhvZCA9PSBNRVRIT0RfR1BJT183MzApCiAJCWlzcl9yZWcgPSBiYW5rLT5iYXNlICsgT01BUDczMF9HUElPX0lOVF9TVEFUVVM7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVJDSF9PTUFQMjRYWAorCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMjRYWCkKKwkJaXNyX3JlZyA9IGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX0lSUVNUQVRVUzE7CisjZW5kaWYKIAotCWlzciA9IF9fcmF3X3JlYWRsKGlzcl9yZWcpOwotCV9lbmFibGVfZ3Bpb19pcnFiYW5rKGJhbmssIGlzciwgMCk7Ci0JX2NsZWFyX2dwaW9faXJxYmFuayhiYW5rLCBpc3IpOwotCV9lbmFibGVfZ3Bpb19pcnFiYW5rKGJhbmssIGlzciwgMSk7Ci0JZGVzYy0+Y2hpcC0+dW5tYXNrKGlycSk7CisJd2hpbGUoMSkgeworCQlpc3IgPSBfX3Jhd19yZWFkbChpc3JfcmVnKTsKKwkJX2VuYWJsZV9ncGlvX2lycWJhbmsoYmFuaywgaXNyLCAwKTsKKwkJX2NsZWFyX2dwaW9faXJxYmFuayhiYW5rLCBpc3IpOworCQlfZW5hYmxlX2dwaW9faXJxYmFuayhiYW5rLCBpc3IsIDEpOworCQlkZXNjLT5jaGlwLT51bm1hc2soaXJxKTsKIAotCWlmICh1bmxpa2VseSghaXNyKSkKLQkJcmV0dXJuOworCQlpZiAoIWlzcikKKwkJCWJyZWFrOwogCi0JZ3Bpb19pcnEgPSBiYW5rLT52aXJ0dWFsX2lycV9zdGFydDsKLQlmb3IgKDsgaXNyICE9IDA7IGlzciA+Pj0gMSwgZ3Bpb19pcnErKykgewotCQlzdHJ1Y3QgaXJxZGVzYyAqZDsKLQkJaWYgKCEoaXNyICYgMSkpCi0JCQljb250aW51ZTsKLQkJZCA9IGlycV9kZXNjICsgZ3Bpb19pcnE7Ci0JCWRlc2NfaGFuZGxlX2lycShncGlvX2lycSwgZCwgcmVncyk7Ci0JfQorCQlncGlvX2lycSA9IGJhbmstPnZpcnR1YWxfaXJxX3N0YXJ0OworCQlmb3IgKDsgaXNyICE9IDA7IGlzciA+Pj0gMSwgZ3Bpb19pcnErKykgeworCQkJc3RydWN0IGlycWRlc2MgKmQ7CisJCQlpZiAoIShpc3IgJiAxKSkKKwkJCQljb250aW51ZTsKKwkJCWQgPSBpcnFfZGVzYyArIGdwaW9faXJxOworCQkJZGVzY19oYW5kbGVfaXJxKGdwaW9faXJxLCBkLCByZWdzKTsKKwkJfQorICAgICAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGdwaW9fYWNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtNjEzLDE0ICs3OTYsMTAgQEAKIHN0YXRpYyB2b2lkIGdwaW9fdW5tYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCXVuc2lnbmVkIGludCBncGlvID0gaXJxIC0gSUhfR1BJT19CQVNFOworCXVuc2lnbmVkIGludCBncGlvX2lkeCA9IGdldF9ncGlvX2luZGV4KGdwaW8pOwogCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSBnZXRfZ3Bpb19iYW5rKGdwaW8pOwogCi0JaWYgKF9nZXRfZ3Bpb19lZGdlX2N0cmwoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbykpID09IE9NQVBfR1BJT19OT19FREdFKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiT01BUCBHUElPICVkOiB0cnlpbmcgdG8gZW5hYmxlIEdQSU8gSVJRIHdoaWxlIG5vIGVkZ2UgaXMgc2V0XG4iLAotCQkgICAgICAgZ3Bpbyk7Ci0JCV9zZXRfZ3Bpb19lZGdlX2N0cmwoYmFuaywgZ2V0X2dwaW9faW5kZXgoZ3BpbyksIE9NQVBfR1BJT19SSVNJTkdfRURHRSk7Ci0JfQotCV9zZXRfZ3Bpb19pcnFlbmFibGUoYmFuaywgZ3BpbywgMSk7CisJX3NldF9ncGlvX2lycWVuYWJsZShiYW5rLCBncGlvX2lkeCwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkIG1wdWlvX2Fja19pcnEodW5zaWduZWQgaW50IGlycSkKQEAgLTY0NSw5ICs4MjQsMTEgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFjaGlwIGdwaW9faXJxX2NoaXAgPSB7Ci0JLmFjawk9IGdwaW9fYWNrX2lycSwKLQkubWFzawk9IGdwaW9fbWFza19pcnEsCi0JLnVubWFzayA9IGdwaW9fdW5tYXNrX2lycSwKKwkuYWNrCQk9IGdwaW9fYWNrX2lycSwKKwkubWFzawkJPSBncGlvX21hc2tfaXJxLAorCS51bm1hc2sJCT0gZ3Bpb191bm1hc2tfaXJxLAorCS5zZXRfdHlwZQk9IGdwaW9faXJxX3R5cGUsCisJLnNldF93YWtlCT0gZ3Bpb193YWtlX2VuYWJsZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxY2hpcCBtcHVpb19pcnFfY2hpcCA9IHsKQEAgLTY1Nyw2ICs4MzgsNyBAQAogfTsKIAogc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7CitzdGF0aWMgc3RydWN0IGNsayAqIGdwaW9fY2sgPSBOVUxMOwogCiBzdGF0aWMgaW50IF9faW5pdCBfb21hcF9ncGlvX2luaXQodm9pZCkKIHsKQEAgLTY2NSw2ICs4NDcsMTQgQEAKIAogCWluaXRpYWxpemVkID0gMTsKIAorCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgeworCQlncGlvX2NrID0gY2xrX2dldChOVUxMLCAiYXJtX2dwaW9fY2siKTsKKwkJaWYgKElTX0VSUihncGlvX2NrKSkKKwkJCXByaW50aygiQ291bGQgbm90IGdldCBhcm1fZ3Bpb19ja1xuIik7CisJCWVsc2UKKwkJCWNsa191c2UoZ3Bpb19jayk7CisJfQorCiAjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDE1MTAKIAlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiT01BUDE1MTAgR1BJTyBoYXJkd2FyZVxuIik7CkBAIC02NzQsNyArODY0LDcgQEAKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpCiAJaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7Ci0JCWludCByZXY7CisJCXUzMiByZXY7CiAKIAkJZ3Bpb19iYW5rX2NvdW50ID0gNTsKIAkJZ3Bpb19iYW5rID0gZ3Bpb19iYW5rXzE2MTA7CkBAIC02OTAsNiArODgwLDE3IEBACiAJCWdwaW9fYmFuayA9IGdwaW9fYmFua183MzA7CiAJfQogI2VuZGlmCisjaWZkZWYgQ09ORklHX0FSQ0hfT01BUDI0WFgKKwlpZiAoY3B1X2lzX29tYXAyNHh4KCkpIHsKKwkJaW50IHJldjsKKworCQlncGlvX2JhbmtfY291bnQgPSA0OworCQlncGlvX2JhbmsgPSBncGlvX2JhbmtfMjR4eDsKKwkJcmV2ID0gb21hcF9yZWFkbChncGlvX2JhbmtbMF0uYmFzZSArIE9NQVAyNFhYX0dQSU9fUkVWSVNJT04pOworCQlwcmludGsoS0VSTl9JTkZPICJPTUFQMjR4eCBHUElPIGhhcmR3YXJlIHZlcnNpb24gJWQuJWRcbiIsCisJCQkocmV2ID4+IDQpICYgMHgwZiwgcmV2ICYgMHgwZik7CisJfQorI2VuZGlmCiAJZm9yIChpID0gMDsgaSA8IGdwaW9fYmFua19jb3VudDsgaSsrKSB7CiAJCWludCBqLCBncGlvX2NvdW50ID0gMTY7CiAKQEAgLTcxMCw2ICs5MTEsNyBAQAogCQlpZiAoYmFuay0+bWV0aG9kID09IE1FVEhPRF9HUElPXzE2MTApIHsKIAkJCV9fcmF3X3dyaXRldygweDAwMDAsIGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0lSUUVOQUJMRTEpOwogCQkJX19yYXdfd3JpdGV3KDB4ZmZmZiwgYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fSVJRU1RBVFVTMSk7CisJCQlfX3Jhd193cml0ZXcoMHgwMDE0LCBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19TWVNDT05GSUcpOwogCQl9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCkBAIC03MjAsNiArOTIyLDE0IEBACiAJCQlncGlvX2NvdW50ID0gMzI7IC8qIDczMCBoYXMgMzItYml0IEdQSU9zICovCiAJCX0KICNlbmRpZgorI2lmZGVmIENPTkZJR19BUkNIX09NQVAyNFhYCisJCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX0dQSU9fMjRYWCkgeworCQkJX19yYXdfd3JpdGVsKDB4MDAwMDAwMDAsIGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX0lSUUVOQUJMRTEpOworCQkJX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsIGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX0lSUVNUQVRVUzEpOworCisJCQlncGlvX2NvdW50ID0gMzI7CisJCX0KKyNlbmRpZgogCQlmb3IgKGogPSBiYW5rLT52aXJ0dWFsX2lycV9zdGFydDsKIAkJICAgICBqIDwgYmFuay0+dmlydHVhbF9pcnFfc3RhcnQgKyBncGlvX2NvdW50OyBqKyspIHsKIAkJCWlmIChiYW5rLT5tZXRob2QgPT0gTUVUSE9EX01QVUlPKQpAQCAtNzM1LDEyICs5NDUsOTcgQEAKIAogCS8qIEVuYWJsZSBzeXN0ZW0gY2xvY2sgZm9yIEdQSU8gbW9kdWxlLgogCSAqIFRoZSBDQU1fQ0xLX0NUUkwgKmlzKiByZWFsbHkgdGhlIHJpZ2h0IHBsYWNlLiAqLwotCWlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkKKwlpZiAoY3B1X2lzX29tYXAxNnh4KCkpCiAJCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoVUxQRF9DQU1fQ0xLX0NUUkwpIHwgMHgwNCwgVUxQRF9DQU1fQ0xLX0NUUkwpOwogCiAJcmV0dXJuIDA7CiB9CiAKKyNpZiBkZWZpbmVkIChDT05GSUdfQVJDSF9PTUFQMTZYWCkgfHwgZGVmaW5lZCAoQ09ORklHX0FSQ0hfT01BUDI0WFgpCitzdGF0aWMgaW50IG9tYXBfZ3Bpb19zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQoreworCWludCBpOworCisJaWYgKCFjcHVfaXNfb21hcDI0eHgoKSAmJiAhY3B1X2lzX29tYXAxNnh4KCkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGdwaW9fYmFua19jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSAmZ3Bpb19iYW5rW2ldOworCQl2b2lkIF9faW9tZW0gKndha2Vfc3RhdHVzOworCQl2b2lkIF9faW9tZW0gKndha2VfY2xlYXI7CisJCXZvaWQgX19pb21lbSAqd2FrZV9zZXQ7CisKKwkJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKKwkJY2FzZSBNRVRIT0RfR1BJT18xNjEwOgorCQkJd2FrZV9zdGF0dXMgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19XQUtFVVBFTkFCTEU7CisJCQl3YWtlX2NsZWFyID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fQ0xFQVJfV0FLRVVQRU5BOworCQkJd2FrZV9zZXQgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19TRVRfV0FLRVVQRU5BOworCQkJYnJlYWs7CisJCWNhc2UgTUVUSE9EX0dQSU9fMjRYWDoKKwkJCXdha2Vfc3RhdHVzID0gYmFuay0+YmFzZSArIE9NQVAyNFhYX0dQSU9fU0VUV0tVRU5BOworCQkJd2FrZV9jbGVhciA9IGJhbmstPmJhc2UgKyBPTUFQMjRYWF9HUElPX0NMRUFSV0tVRU5BOworCQkJd2FrZV9zZXQgPSBiYW5rLT5iYXNlICsgT01BUDI0WFhfR1BJT19TRVRXS1VFTkE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3Bpbl9sb2NrKCZiYW5rLT5sb2NrKTsKKwkJYmFuay0+c2F2ZWRfd2FrZXVwID0gX19yYXdfcmVhZGwod2FrZV9zdGF0dXMpOworCQlfX3Jhd193cml0ZWwoMHhmZmZmZmZmZiwgd2FrZV9jbGVhcik7CisJCV9fcmF3X3dyaXRlbChiYW5rLT5zdXNwZW5kX3dha2V1cCwgd2FrZV9zZXQpOworCQlzcGluX3VubG9jaygmYmFuay0+bG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9ncGlvX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQoreworCWludCBpOworCisJaWYgKCFjcHVfaXNfb21hcDI0eHgoKSAmJiAhY3B1X2lzX29tYXAxNnh4KCkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGdwaW9fYmFua19jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBncGlvX2JhbmsgKmJhbmsgPSAmZ3Bpb19iYW5rW2ldOworCQl2b2lkIF9faW9tZW0gKndha2VfY2xlYXI7CisJCXZvaWQgX19pb21lbSAqd2FrZV9zZXQ7CisKKwkJc3dpdGNoIChiYW5rLT5tZXRob2QpIHsKKwkJY2FzZSBNRVRIT0RfR1BJT18xNjEwOgorCQkJd2FrZV9jbGVhciA9IGJhbmstPmJhc2UgKyBPTUFQMTYxMF9HUElPX0NMRUFSX1dBS0VVUEVOQTsKKwkJCXdha2Vfc2V0ID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fU0VUX1dBS0VVUEVOQTsKKwkJCWJyZWFrOworCQljYXNlIE1FVEhPRF9HUElPXzI0WFg6CisJCQl3YWtlX2NsZWFyID0gYmFuay0+YmFzZSArIE9NQVAxNjEwX0dQSU9fQ0xFQVJfV0FLRVVQRU5BOworCQkJd2FrZV9zZXQgPSBiYW5rLT5iYXNlICsgT01BUDE2MTBfR1BJT19TRVRfV0FLRVVQRU5BOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJfQorCisJCXNwaW5fbG9jaygmYmFuay0+bG9jayk7CisJCV9fcmF3X3dyaXRlbCgweGZmZmZmZmZmLCB3YWtlX2NsZWFyKTsKKwkJX19yYXdfd3JpdGVsKGJhbmstPnNhdmVkX3dha2V1cCwgd2FrZV9zZXQpOworCQlzcGluX3VubG9jaygmYmFuay0+bG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIG9tYXBfZ3Bpb19zeXNjbGFzcyA9IHsKKwlzZXRfa3NldF9uYW1lKCJncGlvIiksCisJLnN1c3BlbmQJPSBvbWFwX2dwaW9fc3VzcGVuZCwKKwkucmVzdW1lCQk9IG9tYXBfZ3Bpb19yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2Ugb21hcF9ncGlvX2RldmljZSA9IHsKKwkuaWQJCT0gMCwKKwkuY2xzCQk9ICZvbWFwX2dwaW9fc3lzY2xhc3MsCit9OworI2VuZGlmCisKIC8qCiAgKiBUaGlzIG1heSBnZXQgY2FsbGVkIGVhcmx5IGZyb20gYm9hcmQgc3BlY2lmaWMgaW5pdAogICovCkBAIC03NTIsMTEgKzEwNDcsMzAgQEAKIAkJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IG9tYXBfZ3Bpb19zeXNpbml0KHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWluaXRpYWxpemVkKQorCQlyZXQgPSBfb21hcF9ncGlvX2luaXQoKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDE2WFgpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfT01BUDI0WFgpCisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpIHx8IGNwdV9pc19vbWFwMjR4eCgpKSB7CisJCWlmIChyZXQgPT0gMCkgeworCQkJcmV0ID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZvbWFwX2dwaW9fc3lzY2xhc3MpOworCQkJaWYgKHJldCA9PSAwKQorCQkJCXJldCA9IHN5c2Rldl9yZWdpc3Rlcigmb21hcF9ncGlvX2RldmljZSk7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybiByZXQ7Cit9CisKIEVYUE9SVF9TWU1CT0wob21hcF9yZXF1ZXN0X2dwaW8pOwogRVhQT1JUX1NZTUJPTChvbWFwX2ZyZWVfZ3Bpbyk7CiBFWFBPUlRfU1lNQk9MKG9tYXBfc2V0X2dwaW9fZGlyZWN0aW9uKTsKIEVYUE9SVF9TWU1CT0wob21hcF9zZXRfZ3Bpb19kYXRhb3V0KTsKIEVYUE9SVF9TWU1CT0wob21hcF9nZXRfZ3Bpb19kYXRhaW4pOwotRVhQT1JUX1NZTUJPTChvbWFwX3NldF9ncGlvX2VkZ2VfY3RybCk7CiAKLWFyY2hfaW5pdGNhbGwob21hcF9ncGlvX2luaXQpOworYXJjaF9pbml0Y2FsbChvbWFwX2dwaW9fc3lzaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvbWNic3AuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jCmluZGV4IDQzNTY3ZDUuLjljOWI3ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tY2JzcC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8YXNtL2FyY2gvZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvbXV4Lmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2RzcF9jb21tb24uaD4KICNpbmNsdWRlIDxhc20vYXJjaC9tY2JzcC5oPgogCiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2Nsb2NrLmg+CkBAIC0xODcsOSArMTg4LDYgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLSNkZWZpbmUgRU5fWE9SUENLCQkxCi0jZGVmaW5lIERTUF9SU1RDVDIgICAgICAgICAgICAgIDB4ZTEwMDgwMTQKLQogc3RhdGljIHZvaWQgb21hcF9tY2JzcF9kc3BfcmVxdWVzdCh2b2lkKQogewogCWlmIChjcHVfaXNfb21hcDE1MTAoKSB8fCBjcHVfaXNfb21hcDE2eHgoKSkgewpAQCAtMTk4LDYgKzE5NiwxMSBAQAogCiAJCS8qIGVuYWJsZSAxMk1IeiBjbG9jayB0byBtY2JzcCAxICYgMyAqLwogCQljbGtfdXNlKG1jYnNwX2RzcHhvcl9jayk7CisKKwkJLyoKKwkJICogRFNQIGV4dGVybmFsIHBlcmlwaGVyYWwgcmVzZXQKKwkJICogRklYTUU6IFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIGRzcCBjb2RlCisJCSAqLwogCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoRFNQX1JTVENUMikgfCAxIHwgMSA8PCAxLAogCQkJICAgICBEU1BfUlNUQ1QyKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW9tYXAvbXV4LmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvbXV4LmMKaW5kZXggZWE3Yjk1NS4uNjQ0ODIwNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL211eC5jCisrKyBiL2FyY2gvYXJtL3BsYXQtb21hcC9tdXguYwpAQCAtNDgsNiArNDgsOSBAQAogCQlwdWxsX29yaWcgPSAwLCBwdWxsID0gMDsKIAl1bnNpZ25lZCBpbnQgbWFzaywgd2FybiA9IDA7CiAKKwlpZiAoY3B1X2lzX29tYXA3eHgoKSkKKwkJcmV0dXJuIDA7CisKIAlpZiAocmVnX2NmZyA+IEFSUkFZX1NJWkUocmVnX2NmZ190YWJsZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJNVVg6IHJlZ19jZmcgJWRcbiIsIHJlZ19jZmcpOwogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9vY3BpLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvb2NwaS5jCmluZGV4IDJlZGUyZWUuLjFmYjE2ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9vY3BpLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL29jcGkuYwpAQCAtMjUsNiArMjUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9wbS5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3BtLmMKaW5kZXggZTY1MzZiMS4uZTE1YzZjMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL3BtLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3BtLmMKQEAgLTM5LDI0ICszOSwzMiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKLSNpbmNsdWRlIDxhc20vYXJjaC9vbWFwMTZ4eC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaXJxcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3RjLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvcG0uaD4KICNpbmNsdWRlIDxhc20vYXJjaC9tdXguaD4KLSNpbmNsdWRlIDxhc20vYXJjaC90Yy5oPgogI2luY2x1ZGUgPGFzbS9hcmNoL3RwczY1MDEwLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvZHNwX2NvbW1vbi5oPgogCiAjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJzcmFtLmgiCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYXJtX3NsZWVwX3NhdmVbQVJNX1NMRUVQX1NBVkVfU0laRV07CiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgdWxwZF9zbGVlcF9zYXZlW1VMUERfU0xFRVBfU0FWRV9TSVpFXTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbXB1aTE1MTBfc2xlZXBfc2F2ZVtNUFVJMTUxMF9TTEVFUF9TQVZFX1NJWkVdOwogc3RhdGljIHVuc2lnbmVkIGludCBtcHVpMTYxMF9zbGVlcF9zYXZlW01QVUkxNjEwX1NMRUVQX1NBVkVfU0laRV07CiAKK3N0YXRpYyB2b2lkICgqb21hcF9zcmFtX2lkbGUpKHZvaWQpID0gTlVMTDsKK3N0YXRpYyB2b2lkICgqb21hcF9zcmFtX3N1c3BlbmQpKHVuc2lnbmVkIGxvbmcgcjAsIHVuc2lnbmVkIGxvbmcgcjEpID0gTlVMTDsKKwogLyoKICAqIExldCdzIHBvd2VyIGRvd24gb24gaWRsZSwgYnV0IG9ubHkgaWYgd2UgYXJlIHJlYWxseQogICogaWRsZSwgYmVjYXVzZSBvbmNlIHdlIHN0YXJ0IGRvd24gdGhlIHBhdGggb2YKQEAgLTY1LDcgKzczLDYgQEAKICAqLwogdm9pZCBvbWFwX3BtX2lkbGUodm9pZCkKIHsKLQlpbnQgKCpmdW5jX3B0cikodm9pZCkgPSAwOwogCXVuc2lnbmVkIGludCBtYXNrMzIgPSAwOwogCiAJLyoKQEAgLTg0LDYgKzkxLDEzIEBACiAJbWFzazMyID0gb21hcF9yZWFkbChBUk1fU1lTU1QpOwogCiAJLyoKKwkgKiBQcmV2ZW50IHRoZSBVTFBEIGZyb20gZW50ZXJpbmcgbG93IHBvd2VyIHN0YXRlIGJ5IHNldHRpbmcKKwkgKiBQT1dFUl9DVFJMX1JFRzo0ID0gMAorCSAqLworCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoVUxQRF9QT1dFUl9DVFJMKSAmCisJCSAgICB+VUxQRF9ERUVQX1NMRUVQX1RSQU5TSVRJT05fRU4sIFVMUERfUE9XRVJfQ1RSTCk7CisKKwkvKgogCSAqIFNpbmNlIGFuIGludGVycnVwdCBtYXkgc2V0IHVwIGEgdGltZXIsIHdlIGRvbid0IHdhbnQgdG8KIAkgKiByZXByb2dyYW0gdGhlIGhhcmR3YXJlIHRpbWVyIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLgogCSAqIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIG9ubHkgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gaWRsZS4KQEAgLTkyLDE4ICsxMDYsOSBAQAogCiAJaWYgKChtYXNrMzIgJiBEU1BfSURMRSkgPT0gMCkgewogCQlfX2FzbV9fIHZvbGF0aWxlICgibWNyCXAxNSwgMCwgcjAsIGM3LCBjMCwgNCIpOwotCX0gZWxzZSB7CisJfSBlbHNlCisJCW9tYXBfc3JhbV9pZGxlKCk7CiAKLQkJaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCQlmdW5jX3B0ciA9ICh2b2lkICopKE9NQVAxNTEwX1NSQU1fSURMRV9TVVNQRU5EKTsKLQkJfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgewotCQkJZnVuY19wdHIgPSAodm9pZCAqKShPTUFQMTYxMF9TUkFNX0lETEVfU1VTUEVORCk7Ci0JCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA1OTEyKCkpIHsKLQkJCWZ1bmNfcHRyID0gKHZvaWQgKikoT01BUDU5MTJfU1JBTV9JRExFX1NVU1BFTkQpOwotCQl9Ci0KLQkJZnVuY19wdHIoKTsKLQl9CiAJbG9jYWxfZmlxX2VuYWJsZSgpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKIH0KQEAgLTExNSw1OCArMTIwLDU1IEBACiAgKi8KIHN0YXRpYyB2b2lkIG9tYXBfcG1fd2FrZXVwX3NldHVwKHZvaWQpCiB7Ci0JLyoKLQkgKiBFbmFibGUgQVJNIFhPUiBjbG9jayBhbmQgcmVsZWFzZSBwZXJpcGhlcmFsIGZyb20gcmVzZXQgYnkKLQkgKiB3cml0aW5nIDEgdG8gUEVSX0VOIGJpdCBpbiBBUk1fUlNUQ1QyLCB0aGlzIGlzIHJlcXVpcmVkCi0JICogZm9yIFVBUlQgY29uZmlndXJhdGlvbiB0byB1c2UgVUFSVDIgdG8gd2FrZSB1cC4KLQkgKi8KLQotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX0lETEVDVDIpIHwgRU5BQkxFX1hPUkNMSywgQVJNX0lETEVDVDIpOwotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX1JTVENUMikgfCBQRVJfRU4sIEFSTV9SU1RDVDIpOwotCW9tYXBfd3JpdGV3KE1PREVNXzMyS19FTiwgVUxQRF9DTE9DS19DVFJMKTsKKwl1MzIgbGV2ZWwxX3dha2UgPSBPTUFQX0lSUV9CSVQoSU5UX0lIMl9JUlEpOworCXUzMiBsZXZlbDJfd2FrZSA9IE9NQVBfSVJRX0JJVChJTlRfVUFSVDIpIHwgT01BUF9JUlFfQklUKElOVF9LRVlCT0FSRCk7CiAKIAkvKgotCSAqIFR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIGV4Y2VwdCBMMS0ybmQgbGV2ZWwgY2FzY2FkZSwKLQkgKiBhbmQgdGhlIEwyIHdha2V1cCBpbnRlcnJ1cHRzOiBrZXlwYWQgYW5kIFVBUlQyLgorCSAqIFR1cm4gb2ZmIGFsbCBpbnRlcnJ1cHRzIGV4Y2VwdCBHUElPIGJhbmsgMSwgTDEtMm5kIGxldmVsIGNhc2NhZGUsCisJICogYW5kIHRoZSBMMiB3YWtldXAgaW50ZXJydXB0czoga2V5cGFkIGFuZCBVQVJUMi4gTm90ZSB0aGF0IHRoZQorCSAqIGRyaXZlcnMgbXVzdCBzdGlsbCBzZXBhcmF0ZWx5IGNhbGwgb21hcF9zZXRfZ3Bpb193YWtldXAoKSB0bworCSAqIHdha2UgdXAgdG8gYSBHUElPIGludGVycnVwdC4KIAkgKi8KKwlpZiAoY3B1X2lzX29tYXAxNTEwKCkgfHwgY3B1X2lzX29tYXAxNnh4KCkpCisJCWxldmVsMV93YWtlIHw9IE9NQVBfSVJRX0JJVChJTlRfR1BJT19CQU5LMSk7CisJZWxzZSBpZiAoY3B1X2lzX29tYXA3MzAoKSkKKwkJbGV2ZWwxX3dha2UgfD0gT01BUF9JUlFfQklUKElOVF83MzBfR1BJT19CQU5LMSk7CiAKLQlvbWFwX3dyaXRlbCh+SVJRX0xFVkVMMiwgT01BUF9JSDFfTUlSKTsKKwlvbWFwX3dyaXRlbCh+bGV2ZWwxX3dha2UsIE9NQVBfSUgxX01JUik7CiAKLQlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJb21hcF93cml0ZWwofihJUlFfVUFSVDIgfCBJUlFfS0VZQk9BUkQpLCAgT01BUF9JSDJfTUlSKTsKLQl9CisJaWYgKGNwdV9pc19vbWFwMTUxMCgpKQorCQlvbWFwX3dyaXRlbCh+bGV2ZWwyX3dha2UsICBPTUFQX0lIMl9NSVIpOwogCisJLyogSU5UXzE2MTBfV0FLRV9VUF9SRVEgaXMgbmVlZGVkIGZvciBHUElPIHdha2V1cC4uLiAqLwogCWlmIChjcHVfaXNfb21hcDE2eHgoKSkgewotCQlvbWFwX3dyaXRlbCh+KElSUV9VQVJUMiB8IElSUV9LRVlCT0FSRCksIE9NQVBfSUgyXzBfTUlSKTsKLQotCQlvbWFwX3dyaXRlbCh+MHgwLCBPTUFQX0lIMl8xX01JUik7CisJCW9tYXBfd3JpdGVsKH5sZXZlbDJfd2FrZSwgT01BUF9JSDJfMF9NSVIpOworCQlvbWFwX3dyaXRlbCh+T01BUF9JUlFfQklUKElOVF8xNjEwX1dBS0VfVVBfUkVRKSwgT01BUF9JSDJfMV9NSVIpOwogCQlvbWFwX3dyaXRlbCh+MHgwLCBPTUFQX0lIMl8yX01JUik7CiAJCW9tYXBfd3JpdGVsKH4weDAsIE9NQVBfSUgyXzNfTUlSKTsKIAl9CiAKLQkvKiAgTmV3IElSUSBhZ3JlZW1lbnQgKi8KKwkvKiAgTmV3IElSUSBhZ3JlZW1lbnQsIHJlY2FsY3VsYXRlIGluIGNhc2NhZGUgb3JkZXIgKi8KKwlvbWFwX3dyaXRlbCgxLCBPTUFQX0lIMl9DT05UUk9MKTsKICAJb21hcF93cml0ZWwoMSwgT01BUF9JSDFfQ09OVFJPTCk7Ci0KLQkvKiBleHRlcm5hbCBQVUxMIHRvIGRvd24sIGJpdCAyMiA9IDAgKi8KLQlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKFBVTExfRFdOX0NUUkxfMikgJiB+KDE8PDIyKSwgUFVMTF9EV05fQ1RSTF8yKTsKIH0KIAogdm9pZCBvbWFwX3BtX3N1c3BlbmQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgbWFzazMyID0gMDsKIAl1bnNpZ25lZCBsb25nIGFyZzAgPSAwLCBhcmcxID0gMDsKLQlpbnQgKCpmdW5jX3B0cikodW5zaWduZWQgc2hvcnQsIHVuc2lnbmVkIHNob3J0KSA9IDA7Ci0JdW5zaWduZWQgc2hvcnQgc2F2ZV9kc3BfaWRsZWN0MjsKIAotCXByaW50aygiUE06IE9NQVAleCBpcyBlbnRlcmluZyBkZWVwIHNsZWVwIG5vdyAuLi5cbiIsIHN5c3RlbV9yZXYpOworCXByaW50aygiUE06IE9NQVAleCBpcyB0cnlpbmcgdG8gZW50ZXIgZGVlcCBzbGVlcC4uLlxuIiwgc3lzdGVtX3Jldik7CisKKwlvbWFwX3NlcmlhbF93YWtlX3RyaWdnZXIoMSk7CiAKIAlpZiAobWFjaGluZV9pc19vbWFwX29zaygpKSB7CiAJCS8qIFN0b3AgTEVEMSAoRDkpIGJsaW5rICovCiAJCXRwczY1MDEwX3NldF9sZWQoTEVEMSwgT0ZGKTsKIAl9CiAKKwlvbWFwX3dyaXRldygweGZmZmYsIFVMUERfU09GVF9ESVNBQkxFX1JFUV9SRUcpOworCiAJLyoKLQkgKiBTdGVwIDE6IHR1cm4gb2ZmIGludGVycnVwdHMKKwkgKiBTdGVwIDE6IHR1cm4gb2ZmIGludGVycnVwdHMgKEZJWE1FOiBOT1RFOiBhbHJlYWR5IGRpc2FibGVkKQogCSAqLwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKQEAgLTIwNyw2ICsyMDksOCBAQAogCUFSTV9TQVZFKEFSTV9DS0NUTCk7CiAJQVJNX1NBVkUoQVJNX0lETEVDVDEpOwogCUFSTV9TQVZFKEFSTV9JRExFQ1QyKTsKKwlpZiAoIShjcHVfaXNfb21hcDE1MTAoKSkpCisJCUFSTV9TQVZFKEFSTV9JRExFQ1QzKTsKIAlBUk1fU0FWRShBUk1fRVdVUENUKTsKIAlBUk1fU0FWRShBUk1fUlNUQ1QxKTsKIAlBUk1fU0FWRShBUk1fUlNUQ1QyKTsKQEAgLTIxNCw0MiArMjE4LDEyIEBACiAJVUxQRF9TQVZFKFVMUERfQ0xPQ0tfQ1RSTCk7CiAJVUxQRF9TQVZFKFVMUERfU1RBVFVTX1JFUSk7CiAKLQkvKgotCSAqIFN0ZXAgMzogTE9XX1BXUiBzaWduYWwgZW5hYmxpbmcKLQkgKgotCSAqIEFsbG93IHRoZSBMT1dfUFdSIHNpZ25hbCB0byBiZSB2aXNpYmxlIG9uIE1QVUlPNSBiYWxsLgotCSAqLwotCWlmIChjcHVfaXNfb21hcDE1MTAoKSkgewotCQkvKiBQT1dFUl9DVFJMX1JFRyA9IDB4MSAoTE9XX1BPV0VSIGlzIGF2YWlsYWJsZSkgKi8KLQkJb21hcF93cml0ZXcob21hcF9yZWFkdyhVTFBEX1BPV0VSX0NUUkwpIHwKLQkJCSAgICBPTUFQMTUxMF9VTFBEX0xPV19QT1dFUl9SRVEsIFVMUERfUE9XRVJfQ1RSTCk7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2eHgoKSkgewotCQkvKiBQT1dFUl9DVFJMX1JFRyA9IDB4MSAoTE9XX1BPV0VSIGlzIGF2YWlsYWJsZSkgKi8KLQkJb21hcF93cml0ZXcob21hcF9yZWFkdyhVTFBEX1BPV0VSX0NUUkwpIHwKLQkJCSAgICBPTUFQMTYxMF9VTFBEX0xPV19QT1dFUl9SRVEsIFVMUERfUE9XRVJfQ1RSTCk7Ci0JfQotCi0JLyogY29uZmlndXJlIExPV19QV1IgcGluICovCi0Jb21hcF9jZmdfcmVnKFQyMF8xNjEwX0xPV19QV1IpOworCS8qIChTdGVwIDMgcmVtb3ZlZCAtIHdlIG5vdyBhbGxvdyBkZWVwIHNsZWVwIGJ5IGRlZmF1bHQpICovCiAKIAkvKgogCSAqIFN0ZXAgNDogT01BUCBEU1AgU2h1dGRvd24KIAkgKi8KIAotCS8qIFNldCBEU1BfUlNUID0gMSBhbmQgRFNQX0VOID0gMCwgcHV0IERTUCBibG9jayBpbnRvIHJlc2V0ICovCi0Jb21hcF93cml0ZWwoKG9tYXBfcmVhZGwoQVJNX1JTVENUMSkgfCBEU1BfUlNUKSAmIH5EU1BfRU5BQkxFLAotCQkgICAgQVJNX1JTVENUMSk7Ci0KLQkvKiBTZXQgRFNQIGJvb3QgbW9kZSB0byBEU1AtSURMRSwgRFNQX0JPT1RfTU9ERSA9IDB4MiAqLwotICAgICAgICBvbWFwX3dyaXRlbChEU1BfSURMRV9NT0RFLCBNUFVJX0RTUF9CT09UX0NPTkZJRyk7Ci0KLQkvKiBTZXQgRU5fRFNQQ0sgPSAwLCBzdG9wIERTUCBibG9jayBjbG9jayAqLwotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX0NLQ1RMKSAmIH5EU1BfQ0xPQ0tfRU5BQkxFLCBBUk1fQ0tDVEwpOwotCi0JLyogU3RvcCBhbnkgRFNQIGRvbWFpbiBjbG9ja3MgKi8KLQlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKEFSTV9JRExFQ1QyKSB8ICgxPDxFTl9BUElDSyksIEFSTV9JRExFQ1QyKTsKLQlzYXZlX2RzcF9pZGxlY3QyID0gX19yYXdfcmVhZHcoRFNQX0lETEVDVDIpOwotCV9fcmF3X3dyaXRldygwLCBEU1BfSURMRUNUMik7CiAKIAkvKgogCSAqIFN0ZXAgNTogV2FrZXVwIEV2ZW50IFNldHVwCkBAIC0yNTgsMjQgKzIzMiw5IEBACiAJb21hcF9wbV93YWtldXBfc2V0dXAoKTsKIAogCS8qCi0JICogU3RlcCA2YTogQVJNIGFuZCBUcmFmZmljIGNvbnRyb2xsZXIgc2h1dGRvd24KLQkgKgotCSAqIFN0ZXAgNiBzdGFydHMgaGVyZSB3aXRoIGNsb2NrIGFuZCB3YXRjaGRvZyBkaXNhYmxlCisJICogU3RlcCA2OiBBUk0gYW5kIFRyYWZmaWMgY29udHJvbGxlciBzaHV0ZG93bgogCSAqLwogCi0JLyogc3RvcCBjbG9ja3MgKi8KLQltYXNrMzIgPSBvbWFwX3JlYWRsKEFSTV9JRExFQ1QyKTsKLQltYXNrMzIgJj0gfigxPDxFTl9XRFRDSyk7ICAvKiBiaXQgMCAtPiAwIChXRFQgY2xvY2spICovCi0JbWFzazMyIHw9ICAoMTw8RU5fWE9SUENLKTsgLyogYml0IDEgLT4gMSAoWE9SUENLIGNsb2NrKSAqLwotCW1hc2szMiAmPSB+KDE8PEVOX1BFUkNLKTsgIC8qIGJpdCAyIC0+IDAgKE1QVVBFUl9DSyBjbG9jaykgKi8KLQltYXNrMzIgJj0gfigxPDxFTl9MQ0RDSyk7ICAvKiBiaXQgMyAtPiAwIChMQ0RDIGNsb2NrKSAqLwotCW1hc2szMiAmPSB+KDE8PEVOX0xCQ0spOyAgIC8qIGJpdCA0IC0+IDAgKGxvY2FsIGJ1cyBjbG9jaykgKi8KLQltYXNrMzIgfD0gICgxPDxFTl9BUElDSyk7ICAvKiBiaXQgNiAtPiAxIChNUFVJIGNsb2NrKSAqLwotCW1hc2szMiAmPSB+KDE8PEVOX1RJTUNLKTsgIC8qIGJpdCA3IC0+IDAgKE1QVSB0aW1lciBjbG9jaykgKi8KLQltYXNrMzIgJj0gfigxPDxETUFDS19SRVEpOyAvKiBiaXQgOCAtPiAwIChETUFDIGNsb2NrKSAqLwotCW1hc2szMiAmPSB+KDE8PEVOX0dQSU9DSyk7IC8qIGJpdCA5IC0+IDAgKEdQSU8gY2xvY2spICovCi0Jb21hcF93cml0ZWwobWFzazMyLCBBUk1fSURMRUNUMik7Ci0KIAkvKiBkaXNhYmxlIEFSTSB3YXRjaGRvZyAqLwogCW9tYXBfd3JpdGVsKDB4MDBGNSwgT01BUF9XRFRfVElNRVJfTU9ERSk7CiAJb21hcF93cml0ZWwoMHgwMEEwLCBPTUFQX1dEVF9USU1FUl9NT0RFKTsKQEAgLTI5NSw0NyArMjU0LDI0IEBACiAJYXJnMCA9IGFybV9zbGVlcF9zYXZlW0FSTV9TTEVFUF9TQVZFX0FSTV9JRExFQ1QxXTsKIAlhcmcxID0gYXJtX3NsZWVwX3NhdmVbQVJNX1NMRUVQX1NBVkVfQVJNX0lETEVDVDJdOwogCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCWZ1bmNfcHRyID0gKHZvaWQgKikoT01BUDE1MTBfU1JBTV9BUElfU1VTUEVORCk7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDE2MTAoKSB8fCBjcHVfaXNfb21hcDE3MTAoKSkgewotCQlmdW5jX3B0ciA9ICh2b2lkICopKE9NQVAxNjEwX1NSQU1fQVBJX1NVU1BFTkQpOwotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA1OTEyKCkpIHsKLQkJZnVuY19wdHIgPSAodm9pZCAqKShPTUFQNTkxMl9TUkFNX0FQSV9TVVNQRU5EKTsKLQl9Ci0KIAkvKgogCSAqIFN0ZXAgNmM6IEFSTSBhbmQgVHJhZmZpYyBjb250cm9sbGVyIHNodXRkb3duCiAJICoKIAkgKiBKdW1wIHRvIGFzc2VtYmx5IGNvZGUuIFRoZSBwcm9jZXNzb3Igd2lsbCBzdGF5IHRoZXJlCiAgCSAqIHVudGlsIHdha2UgdXAuCiAJICovCi0KLSAgICAgICAgZnVuY19wdHIoYXJnMCwgYXJnMSk7CisgICAgICAgIG9tYXBfc3JhbV9zdXNwZW5kKGFyZzAsIGFyZzEpOwogCiAJLyoKIAkgKiBJZiB3ZSBhcmUgaGVyZSwgcHJvY2Vzc29yIGlzIHdva2VuIHVwIQogCSAqLwogCi0JaWYgKGNwdV9pc19vbWFwMTUxMCgpKSB7Ci0JCS8qIFBPV0VSX0NUUkxfUkVHID0gMHgwIChMT1dfUE9XRVIgaXMgZGlzYWJsZWQpICovCi0JCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoVUxQRF9QT1dFUl9DVFJMKSAmCi0JCQkgICAgfk9NQVAxNTEwX1VMUERfTE9XX1BPV0VSX1JFUSwgVUxQRF9QT1dFUl9DVFJMKTsKLQl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7Ci0JCS8qIFBPV0VSX0NUUkxfUkVHID0gMHgwIChMT1dfUE9XRVIgaXMgZGlzYWJsZWQpICovCi0JCW9tYXBfd3JpdGV3KG9tYXBfcmVhZHcoVUxQRF9QT1dFUl9DVFJMKSAmCi0JCQkgICAgfk9NQVAxNjEwX1VMUERfTE9XX1BPV0VSX1JFUSwgVUxQRF9QT1dFUl9DVFJMKTsKLQl9Ci0KLQotCS8qIFJlc3RvcmUgRFNQIGNsb2NrcyAqLwotCW9tYXBfd3JpdGVsKG9tYXBfcmVhZGwoQVJNX0lETEVDVDIpIHwgKDE8PEVOX0FQSUNLKSwgQVJNX0lETEVDVDIpOwotCV9fcmF3X3dyaXRldyhzYXZlX2RzcF9pZGxlY3QyLCBEU1BfSURMRUNUMik7Ci0JQVJNX1JFU1RPUkUoQVJNX0lETEVDVDIpOwotCiAJLyoKIAkgKiBSZXN0b3JlIEFSTSBzdGF0ZSwgZXhjZXB0IEFSTV9JRExFQ1QxLzIgd2hpY2ggb21hcF9jcHVfc3VzcGVuZCBkaWQKIAkgKi8KIAorCWlmICghKGNwdV9pc19vbWFwMTUxMCgpKSkKKwkJQVJNX1JFU1RPUkUoQVJNX0lETEVDVDMpOwogCUFSTV9SRVNUT1JFKEFSTV9DS0NUTCk7CiAJQVJNX1JFU1RPUkUoQVJNX0VXVVBDVCk7CiAJQVJNX1JFU1RPUkUoQVJNX1JTVENUMSk7CkBAIC0zNjYsNiArMzAyLDggQEAKIAkJTVBVSTE2MTBfUkVTVE9SRShPTUFQX0lIMl8zX01JUik7CiAJfQogCisJb21hcF93cml0ZXcoMCwgVUxQRF9TT0ZUX0RJU0FCTEVfUkVRX1JFRyk7CisKIAkvKgogCSAqIFJlZW5hYmxlIGludGVycnVwdHMKIAkgKi8KQEAgLTM3Myw2ICszMTEsOCBAQAogCWxvY2FsX2lycV9lbmFibGUoKTsKIAlsb2NhbF9maXFfZW5hYmxlKCk7CiAKKwlvbWFwX3NlcmlhbF93YWtlX3RyaWdnZXIoMCk7CisKIAlwcmludGsoIlBNOiBPTUFQJXggaXMgcmUtc3RhcnRpbmcgZnJvbSBkZWVwIHNsZWVwLi4uXG4iLCBzeXN0ZW1fcmV2KTsKIAogCWlmIChtYWNoaW5lX2lzX29tYXBfb3NrKCkpIHsKQEAgLTQwMSw2ICszNDEsOCBAQAogCUFSTV9TQVZFKEFSTV9DS0NUTCk7CiAJQVJNX1NBVkUoQVJNX0lETEVDVDEpOwogCUFSTV9TQVZFKEFSTV9JRExFQ1QyKTsKKwlpZiAoIShjcHVfaXNfb21hcDE1MTAoKSkpCisJCUFSTV9TQVZFKEFSTV9JRExFQ1QzKTsKIAlBUk1fU0FWRShBUk1fRVdVUENUKTsKIAlBUk1fU0FWRShBUk1fUlNUQ1QxKTsKIAlBUk1fU0FWRShBUk1fUlNUQ1QyKTsKQEAgLTQzNiw2ICszNzgsNyBAQAogCQkgICAiQVJNX0NLQ1RMX1JFRzogICAgICAgICAgICAweCUtOHggICAgIFxuIgogCQkgICAiQVJNX0lETEVDVDFfUkVHOiAgICAgICAgICAweCUtOHggICAgIFxuIgogCQkgICAiQVJNX0lETEVDVDJfUkVHOiAgICAgICAgICAweCUtOHggICAgIFxuIgorCQkgICAiQVJNX0lETEVDVDNfUkVHOgkgICAgICAweCUtOHggICAgIFxuIgogCQkgICAiQVJNX0VXVVBDVF9SRUc6ICAgICAgICAgICAweCUtOHggICAgIFxuIgogCQkgICAiQVJNX1JTVENUMV9SRUc6ICAgICAgICAgICAweCUtOHggICAgIFxuIgogCQkgICAiQVJNX1JTVENUMl9SRUc6ICAgICAgICAgICAweCUtOHggICAgIFxuIgpAQCAtNDQ5LDYgKzM5Miw3IEBACiAJCSAgIEFSTV9TSE9XKEFSTV9DS0NUTCksCiAJCSAgIEFSTV9TSE9XKEFSTV9JRExFQ1QxKSwKIAkJICAgQVJNX1NIT1coQVJNX0lETEVDVDIpLAorCQkgICBBUk1fU0hPVyhBUk1fSURMRUNUMyksCiAJCSAgIEFSTV9TSE9XKEFSTV9FV1VQQ1QpLAogCQkgICBBUk1fU0hPVyhBUk1fUlNUQ1QxKSwKIAkJICAgQVJNX1NIT1coQVJNX1JTVENUMiksCkBAIC01MDcsNyArNDUxLDcgQEAKIAogCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZHJpdmVyL29tYXBfcG0iLAogCQkJCSAgICAgICBTX0lXVVNSIHwgU19JUlVHTywgTlVMTCwKLQkJCQkgICAgICAgb21hcF9wbV9yZWFkX3Byb2MsIDApOworCSAgIG9tYXBfcG1fcmVhZF9wcm9jLCBOVUxMKTsKIH0KIAogI2VuZGlmIC8qIERFQlVHICYmIENPTkZJR19QUk9DX0ZTICovCkBAIC01ODAsNyArNTI0LDIxIEBACiB9CiAKIAotc3RydWN0IHBtX29wcyBvbWFwX3BtX29wcyA9eworc3RhdGljIGlycXJldHVybl90ICBvbWFwX3dha2V1cF9pbnRlcnJ1cHQoaW50ICBpcnEsIHZvaWQgKiAgZGV2LAorCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKiAgcmVncykKK3sKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG9tYXBfd2FrZXVwX2lycSA9IHsKKwkubmFtZQkJPSAicGVyaXBoZXJhbCB3YWtldXAiLAorCS5mbGFncwkJPSBTQV9JTlRFUlJVUFQsCisJLmhhbmRsZXIJPSBvbWFwX3dha2V1cF9pbnRlcnJ1cHQKK307CisKKworCitzdGF0aWMgc3RydWN0IHBtX29wcyBvbWFwX3BtX29wcyA9ewogCS5wbV9kaXNrX21vZGUgPSAwLAogICAgICAgICAucHJlcGFyZSAgICAgICAgPSBvbWFwX3BtX3ByZXBhcmUsCiAgICAgICAgIC5lbnRlciAgICAgICAgICA9IG9tYXBfcG1fZW50ZXIsCkBAIC01OTAsNDIgKzU0OCw2MSBAQAogc3RhdGljIGludCBfX2luaXQgb21hcF9wbV9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKCJQb3dlciBNYW5hZ2VtZW50IGZvciBUSSBPTUFQLlxuIik7Ci0JcG1faWRsZSA9IG9tYXBfcG1faWRsZTsKIAkvKgogCSAqIFdlIGNvcHkgdGhlIGFzc2VtYmxlciBzbGVlcC93YWtldXAgcm91dGluZXMgdG8gU1JBTS4KIAkgKiBUaGVzZSByb3V0aW5lcyBuZWVkIHRvIGJlIGluIFNSQU0gYXMgdGhhdCdzIHRoZSBvbmx5CiAJICogbWVtb3J5IHRoZSBNUFUgY2FuIHNlZSB3aGVuIGl0IHdha2VzIHVwLgogCSAqLwotCi0jaWZkZWYJQ09ORklHX0FSQ0hfT01BUDE1MTAKIAlpZiAoY3B1X2lzX29tYXAxNTEwKCkpIHsKLQkJbWVtY3B5KCh2b2lkICopT01BUDE1MTBfU1JBTV9JRExFX1NVU1BFTkQsCi0JCSAgICAgICBvbWFwMTUxMF9pZGxlX2xvb3Bfc3VzcGVuZCwKLQkJICAgICAgIG9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kX3N6KTsKLQkJbWVtY3B5KCh2b2lkICopT01BUDE1MTBfU1JBTV9BUElfU1VTUEVORCwgb21hcDE1MTBfY3B1X3N1c3BlbmQsCi0JCSAgICAgICBvbWFwMTUxMF9jcHVfc3VzcGVuZF9zeik7Ci0JfSBlbHNlCi0jZW5kaWYKLQlpZiAoY3B1X2lzX29tYXAxNjEwKCkgfHwgY3B1X2lzX29tYXAxNzEwKCkpIHsKLQkJbWVtY3B5KCh2b2lkICopT01BUDE2MTBfU1JBTV9JRExFX1NVU1BFTkQsCi0JCSAgICAgICBvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZCwKLQkJICAgICAgIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kX3N6KTsKLQkJbWVtY3B5KCh2b2lkICopT01BUDE2MTBfU1JBTV9BUElfU1VTUEVORCwgb21hcDE2MTBfY3B1X3N1c3BlbmQsCi0JCSAgICAgICBvbWFwMTYxMF9jcHVfc3VzcGVuZF9zeik7Ci0JfSBlbHNlIGlmIChjcHVfaXNfb21hcDU5MTIoKSkgewotCQltZW1jcHkoKHZvaWQgKilPTUFQNTkxMl9TUkFNX0lETEVfU1VTUEVORCwKLQkJICAgICAgIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kLAotCQkgICAgICAgb21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opOwotCQltZW1jcHkoKHZvaWQgKilPTUFQNTkxMl9TUkFNX0FQSV9TVVNQRU5ELCBvbWFwMTYxMF9jcHVfc3VzcGVuZCwKLQkJICAgICAgIG9tYXAxNjEwX2NwdV9zdXNwZW5kX3N6KTsKKwkJb21hcF9zcmFtX2lkbGUgPSBvbWFwX3NyYW1fcHVzaChvbWFwMTUxMF9pZGxlX2xvb3Bfc3VzcGVuZCwKKwkJCQkJCW9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kX3N6KTsKKwkJb21hcF9zcmFtX3N1c3BlbmQgPSBvbWFwX3NyYW1fcHVzaChvbWFwMTUxMF9jcHVfc3VzcGVuZCwKKwkJCQkJCSAgIG9tYXAxNTEwX2NwdV9zdXNwZW5kX3N6KTsKKwl9IGVsc2UgaWYgKGNwdV9pc19vbWFwMTZ4eCgpKSB7CisJCW9tYXBfc3JhbV9pZGxlID0gb21hcF9zcmFtX3B1c2gob21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmQsCisJCQkJCQlvbWFwMTYxMF9pZGxlX2xvb3Bfc3VzcGVuZF9zeik7CisJCW9tYXBfc3JhbV9zdXNwZW5kID0gb21hcF9zcmFtX3B1c2gob21hcDE2MTBfY3B1X3N1c3BlbmQsCisJCQkJCQkgICBvbWFwMTYxMF9jcHVfc3VzcGVuZF9zeik7CiAJfQogCisJaWYgKG9tYXBfc3JhbV9pZGxlID09IE5VTEwgfHwgb21hcF9zcmFtX3N1c3BlbmQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlBNIG5vdCBpbml0aWFsaXplZDogTWlzc2luZyBTUkFNIHN1cHBvcnRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwbV9pZGxlID0gb21hcF9wbV9pZGxlOworCisJc2V0dXBfaXJxKElOVF8xNjEwX1dBS0VfVVBfUkVRLCAmb21hcF93YWtldXBfaXJxKTsKKyNpZiAwCisJLyogLS0tIEJFR0lOIEJPQVJELURFUEVOREVOVCBDT0RFIC0tLSAqLworCS8qIFNsZWVweCBtYXNrIGRpcmVjdGlvbiAqLworCW9tYXBfd3JpdGV3KChvbWFwX3JlYWR3KDB4ZmZmYjUwMDgpICYgfjIpLCAweGZmZmI1MDA4KTsKKwkvKiBVbm1hc2sgc2xlZXB4IHNpZ25hbCAqLworCW9tYXBfd3JpdGV3KChvbWFwX3JlYWR3KDB4ZmZmYjUwMDQpICYgfjIpLCAweGZmZmI1MDA0KTsKKwkvKiAtLS0gRU5EIEJPQVJELURFUEVOREVOVCBDT0RFIC0tLSAqLworI2VuZGlmCisKKwkvKiBQcm9ncmFtIG5ldyBwb3dlciByYW1wLXVwIHRpbWUKKwkgKiAoMCBmb3IgbW9zdCBib2FyZHMgc2luY2Ugd2UgZG9uJ3QgbG93ZXIgdm9sdGFnZSB3aGVuIGluIGRlZXAgc2xlZXApCisJICovCisJb21hcF93cml0ZXcoVUxQRF9TRVRVUF9BTkFMT0dfQ0VMTF8zX1ZBTCwgVUxQRF9TRVRVUF9BTkFMT0dfQ0VMTF8zKTsKKworCS8qIFNldHVwIFVMUEQgUE9XRVJfQ1RSTF9SRUcgLSBlbnRlciBkZWVwIHNsZWVwIHdoZW5ldmVyIHBvc3NpYmxlICovCisJb21hcF93cml0ZXcoVUxQRF9QT1dFUl9DVFJMX1JFR19WQUwsIFVMUERfUE9XRVJfQ1RSTCk7CisKKwkvKiBDb25maWd1cmUgSURMRUNUMyAqLworCWlmIChjcHVfaXNfb21hcDE2eHgoKSkKKwkJb21hcF93cml0ZWwoT01BUDE2MTBfSURMRUNUM19WQUwsIE9NQVAxNjEwX0lETEVDVDMpOworCiAJcG1fc2V0X29wcygmb21hcF9wbV9vcHMpOwogCiAjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKIAlvbWFwX3BtX2luaXRfcHJvYygpOwogI2VuZGlmCiAKKwkvKiBjb25maWd1cmUgTE9XX1BXUiBwaW4gKi8KKwlvbWFwX2NmZ19yZWcoVDIwXzE2MTBfTE9XX1BXUik7CisKIAlyZXR1cm4gMDsKIH0KIF9faW5pdGNhbGwob21hcF9wbV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9zbGVlcC5TIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NsZWVwLlMKaW5kZXggMjc5NDkwYy4uOWY3NDU4MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL3NsZWVwLlMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3NsZWVwLlMKQEAgLTY2LDcgKzY2LDcgQEAKIAlAIGdldCBBUk1fSURMRUNUMiBpbnRvIHIyCiAJbGRyaAlyMiwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCiAJbW92CXI1LCAjT01BUDE1MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZgotIAlvcnIJcjUscjUsICNPTUFQMTUxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmMDAKKwlvcnIJcjUsIHI1LCAjT01BUDE1MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZjAwCiAJc3RyaAlyNSwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCiAKIAlAIHJlcXVlc3QgQVJNIGlkbGUKQEAgLTc2LDcgKzc2LDcgQEAKIAlzdHJoCXIzLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KIAogCW1vdglyNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmCi0Jb3JyICAgICByNSwgcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZjAwCisJb3JyCXI1LCByNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmMDAKIGxfMTUxMDoJc3VicwlyNSwgcjUsICMxCiAJYm5lCWxfMTUxMAogLyoKQEAgLTk2LDcgKzk2LDcgQEAKIAlzdHJoCXIyLCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KIAlzdHJoCXIxLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KIAotCWxkbWZkICAgc3AhLCB7cjAgLSByMTIsIHBjfSAgICAgQCByZXN0b3JlIHJlZ3MgYW5kIHJldHVybgorCWxkbWZkCXNwISwge3IwIC0gcjEyLCBwY30JCUAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KIAogRU5UUlkob21hcDE1MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opCiAJLndvcmQJLiAtIG9tYXAxNTEwX2lkbGVfbG9vcF9zdXNwZW5kCkBAIC0xMTUsOCArMTE1LDggQEAKIAlAIHR1cm4gb2ZmIGNsb2NrIGRvbWFpbnMKIAlAIGdldCBBUk1fSURMRUNUMiBpbnRvIHIyCiAJbGRyaAlyMiwgW3I0LCAjQVJNX0lETEVDVDJfQVNNX09GRlNFVCAmIDB4ZmZdCi0JbW92CXI1LCAjT01BUDE2MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZgotIAlvcnIJcjUscjUsICNPTUFQMTYxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmMDAKKwltb3YJcjUsICNPTUFQMTYxMF9JRExFQ1QyX1NMRUVQX1ZBTCAmIDB4ZmYKKwlvcnIJcjUsIHI1LCAjT01BUDE2MTBfSURMRUNUMl9TTEVFUF9WQUwgJiAweGZmMDAKIAlzdHJoCXI1LCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KIAogCUAgcmVxdWVzdCBBUk0gaWRsZQpAQCAtMTI2LDcgKzEyNiw3IEBACiAJc3RyaAlyMywgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCiAKIAltb3YJcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZgotCW9yciAgICAgcjUsIHI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYwMAorCW9ycglyNSwgcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZjAwCiBsXzE2MTA6CXN1YnMJcjUsIHI1LCAjMQogCWJuZQlsXzE2MTAKIC8qCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlzdHJoCXIyLCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KIAlzdHJoCXIxLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KIAotCWxkbWZkICAgc3AhLCB7cjAgLSByMTIsIHBjfSAgICAgQCByZXN0b3JlIHJlZ3MgYW5kIHJldHVybgorCWxkbWZkCXNwISwge3IwIC0gcjEyLCBwY30JCUAgcmVzdG9yZSByZWdzIGFuZCByZXR1cm4KIAogRU5UUlkob21hcDE2MTBfaWRsZV9sb29wX3N1c3BlbmRfc3opCiAJLndvcmQJLiAtIG9tYXAxNjEwX2lkbGVfbG9vcF9zdXNwZW5kCkBAIC0yMDgsNyArMjA4LDcgQEAKIAogCUAgdHVybiBvZmYgY2xvY2sgZG9tYWlucwogCW1vdglyNSwgI09NQVAxNTEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYKLSAJb3JyCXI1LHI1LCAjT01BUDE1MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZjAwCisJb3JyCXI1LCByNSwgI09NQVAxNTEwX0lETEVfQ0xPQ0tfRE9NQUlOUyAmIDB4ZmYwMAogCXN0cmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQogCiAJQCByZXF1ZXN0IEFSTSBpZGxlCkBAIC0yMTcsNyArMjE3LDcgQEAKIAlzdHJoCXIzLCBbcjQsICNBUk1fSURMRUNUMV9BU01fT0ZGU0VUICYgMHhmZl0KIAogCW1vdglyNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmCi0Jb3JyICAgICByNSwgcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZjAwCisJb3JyCXI1LCByNSwgI0lETEVfV0FJVF9DWUNMRVMgJiAweGZmMDAKIGxfMTUxMF8yOgogCXN1YnMJcjUsIHI1LCAjMQogCWJuZQlsXzE1MTBfMgpAQCAtMjM3LDcgKzIzNyw3IEBACiAJc3RyaAlyMCwgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCiAKIAlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCi0JbGRtZmQgICBzcCEsIHtyMCAtIHIxMiwgcGN9CisJbGRtZmQJc3AhLCB7cjAgLSByMTIsIHBjfQogCiBFTlRSWShvbWFwMTUxMF9jcHVfc3VzcGVuZF9zeikKIAkud29yZAkuIC0gb21hcDE1MTBfY3B1X3N1c3BlbmQKQEAgLTI0OSwyMSArMjQ5LDI2IEBACiAJQCBzYXZlIHJlZ2lzdGVycyBvbiBzdGFjawogCXN0bWZkCXNwISwge3IwIC0gcjEyLCBscn0KIAorCUAgRHJhaW4gd3JpdGUgY2FjaGUKKwltb3YJcjQsICMwCisJbWNyCXAxNSwgMCwgcjAsIGM3LCBjMTAsIDQKKwlub3AKKwogCUAgbG9hZCBiYXNlIGFkZHJlc3Mgb2YgVHJhZmZpYyBDb250cm9sbGVyCi0JbW92CXI0LCAjVENNSUZfQVNNX0JBU0UgJiAweGZmMDAwMDAwCi0Jb3JyCXI0LCByNCwgI1RDTUlGX0FTTV9CQVNFICYgMHgwMGZmMDAwMAotCW9ycglyNCwgcjQsICNUQ01JRl9BU01fQkFTRSAmIDB4MDAwMGZmMDAKKwltb3YJcjYsICNUQ01JRl9BU01fQkFTRSAmIDB4ZmYwMDAwMDAKKwlvcnIJcjYsIHI2LCAjVENNSUZfQVNNX0JBU0UgJiAweDAwZmYwMDAwCisJb3JyCXI2LCByNiwgI1RDTUlGX0FTTV9CQVNFICYgMHgwMDAwZmYwMAogCiAJQCBwcmVwYXJlIHRvIHB1dCBTRFJBTSBpbnRvIHNlbGYtcmVmcmVzaCBtYW51YWxseQotCWxkcglyNSwgW3I0LCAjRU1JRkZfU0RSQU1fQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQotCW9ycglyNSwgcjUsICNTRUxGX1JFRlJFU0hfTU9ERSAmIDB4ZmYwMDAwMDAKLQlvcnIJcjUsIHI1LCAjU0VMRl9SRUZSRVNIX01PREUgJiAweDAwMDAwMGZmCi0Jc3RyCXI1LCBbcjQsICNFTUlGRl9TRFJBTV9DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisJbGRyCXI3LCBbcjYsICNFTUlGRl9TRFJBTV9DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisJb3JyCXI5LCByNywgI1NFTEZfUkVGUkVTSF9NT0RFICYgMHhmZjAwMDAwMAorCW9ycglyOSwgcjksICNTRUxGX1JFRlJFU0hfTU9ERSAmIDB4MDAwMDAwZmYKKwlzdHIJcjksIFtyNiwgI0VNSUZGX1NEUkFNX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KIAogCUAgcHJlcGFyZSB0byBwdXQgRU1JRlMgdG8gU2xlZXAKLQlsZHIJcjUsIFtyNCwgI0VNSUZTX0NPTkZJR19BU01fT0ZGU0VUICYgMHhmZl0KLQlvcnIJcjUsIHI1LCAjSURMRV9FTUlGU19SRVFVRVNUICYgMHhmZgotCXN0cglyNSwgW3I0LCAjRU1JRlNfQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQorCWxkcglyOCwgW3I2LCAjRU1JRlNfQ09ORklHX0FTTV9PRkZTRVQgJiAweGZmXQorCW9ycglyOSwgcjgsICNJRExFX0VNSUZTX1JFUVVFU1QgJiAweGZmCisJc3RyCXI5LCBbcjYsICNFTUlGU19DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCiAKIAlAIGxvYWQgYmFzZSBhZGRyZXNzIG9mIEFSTV9JRExFQ1QxIGFuZCBBUk1fSURMRUNUMgogCW1vdglyNCwgI0NMS0dFTl9SRUdfQVNNX0JBU0UgJiAweGZmMDAwMDAwCkBAIC0yNzEsMjYgKzI3NiwyMiBAQAogCW9ycglyNCwgcjQsICNDTEtHRU5fUkVHX0FTTV9CQVNFICYgMHgwMDAwZmYwMAogCiAJQCB0dXJuIG9mZiBjbG9jayBkb21haW5zCi0JbW92CXI1LCAjT01BUDE2MTBfSURMRV9DTE9DS19ET01BSU5TICYgMHhmZgotIAlvcnIJcjUscjUsICNPTUFQMTYxMF9JRExFX0NMT0NLX0RPTUFJTlMgJiAweGZmMDAKLQlzdHJoCXI1LCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KLQotCUAgd29yayBhcm91bmQgZXJyYXRhIG9mIE9NQVAxNjEwLzU5MTIuIEVuYWJsZSAoISkgcGVyaXBoZXJhbAotCUAgY2xvY2sgdG8gbGV0IHRoZSBjaGlwIGdvIGludG8gZGVlcCBzbGVlcAotCWxkcmgJcjUsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQotIAlvcnIJcjUscjUsICNFTl9QRVJDS19CSVQgJiAweGZmCisJQCBkbyBub3QgZGlzYWJsZSBQRVJDSyAoMHgwNCkKKwltb3YJcjUsICNPTUFQMTYxMF9JRExFQ1QyX1NMRUVQX1ZBTCAmIDB4ZmYKKwlvcnIJcjUsIHI1LCAjT01BUDE2MTBfSURMRUNUMl9TTEVFUF9WQUwgJiAweGZmMDAKIAlzdHJoCXI1LCBbcjQsICNBUk1fSURMRUNUMl9BU01fT0ZGU0VUICYgMHhmZl0KIAogCUAgcmVxdWVzdCBBUk0gaWRsZQotCW1vdglyMywgI09NQVAxNjEwX0RFRVBfU0xFRVBfUkVRVUVTVCAmIDB4ZmYKLQlvcnIJcjMsIHIzLCAjT01BUDE2MTBfREVFUF9TTEVFUF9SRVFVRVNUICYgMHhmZjAwCisJbW92CXIzLCAjT01BUDE2MTBfSURMRUNUMV9TTEVFUF9WQUwgJiAweGZmCisJb3JyCXIzLCByMywgI09NQVAxNjEwX0lETEVDVDFfU0xFRVBfVkFMICYgMHhmZjAwCiAJc3RyaAlyMywgW3I0LCAjQVJNX0lETEVDVDFfQVNNX09GRlNFVCAmIDB4ZmZdCiAKLQltb3YJcjUsICNJRExFX1dBSVRfQ1lDTEVTICYgMHhmZgotCW9yciAgICAgcjUsIHI1LCAjSURMRV9XQUlUX0NZQ0xFUyAmIDB4ZmYwMAotbF8xNjEwXzI6Ci0Jc3VicwlyNSwgcjUsICMxCi0JYm5lCWxfMTYxMF8yCisJQCBkaXNhYmxlIGluc3RydWN0aW9uIGNhY2hlCisJbXJjCXAxNSwgMCwgcjksIGMxLCBjMCwgMAorCWJpYwlyMiwgcjksICMweDEwMDAKKwltY3IJcDE1LCAwLCByMiwgYzEsIGMwLCAwCisJbm9wCisKIC8qCiAgKiBMZXQncyB3YWl0IGZvciB0aGUgbmV4dCB3YWtlIHVwIGV2ZW50IHRvIHdha2UgdXMgdXAuIHIwIGNhbid0IGJlCiAgKiB1c2VkIGhlcmUgYmVjYXVzZSByMCBob2xkcyBBUk1fSURMRUNUMQpAQCAtMzAxLDEzICszMDIsMjEgQEAKICAqIG9tYXAxNjEwX2NwdV9zdXNwZW5kKCkncyByZXN1bWUgcG9pbnQuCiAgKgogICogSXQgd2lsbCBqdXN0IHN0YXJ0IGV4ZWN1dGluZyBoZXJlLCBzbyB3ZSdsbCByZXN0b3JlIHN0dWZmIGZyb20gdGhlCi0gKiBzdGFjaywgcmVzZXQgdGhlIEFSTV9JRExFQ1QxIGFuZCBBUk1fSURMRUNUMi4KKyAqIHN0YWNrLgogICovCisJQCByZS1lbmFibGUgSWNhY2hlCisJbWNyCXAxNSwgMCwgcjksIGMxLCBjMCwgMAorCisJQCByZXNldCB0aGUgQVJNX0lETEVDVDEgYW5kIEFSTV9JRExFQ1QyLgogCXN0cmgJcjEsIFtyNCwgI0FSTV9JRExFQ1QyX0FTTV9PRkZTRVQgJiAweGZmXQogCXN0cmgJcjAsIFtyNCwgI0FSTV9JRExFQ1QxX0FTTV9PRkZTRVQgJiAweGZmXQogCisJQCBSZXN0b3JlIEVNSUZGIGNvbnRyb2xzCisJc3RyCXI3LCBbcjYsICNFTUlGRl9TRFJBTV9DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisJc3RyCXI4LCBbcjYsICNFTUlGU19DT05GSUdfQVNNX09GRlNFVCAmIDB4ZmZdCisKIAlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCi0JbGRtZmQgICBzcCEsIHtyMCAtIHIxMiwgcGN9CisJbGRtZmQJc3AhLCB7cjAgLSByMTIsIHBjfQogCiBFTlRSWShvbWFwMTYxMF9jcHVfc3VzcGVuZF9zeikKIAkud29yZAkuIC0gb21hcDE2MTBfY3B1X3N1c3BlbmQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLWZuLlMgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS1mbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZWEzNjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS1mbi5TCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5TCisgKgorICogRnVuY3Rpb25zIHRoYXQgbmVlZCB0byBiZSBydW4gaW4gaW50ZXJuYWwgU1JBTQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgorCisJLnRleHQKKworLyoKKyAqIFJlcHJvZ3JhbXMgVUxQRCBhbmQgQ0tDVEwuCisgKi8KK0VOVFJZKHNyYW1fcmVwcm9ncmFtX2Nsb2NrKQorCXN0bWZkCXNwISwge3IwIC0gcjEyLCBscn0JCUAgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKKworCW1vdglyMiwgI0lPX0FERFJFU1MoRFBMTF9DVEwpICYgMHhmZjAwMDAwMAorCW9ycglyMiwgcjIsICNJT19BRERSRVNTKERQTExfQ1RMKSAmIDB4MDBmZjAwMDAKKwlvcnIJcjIsIHIyLCAjSU9fQUREUkVTUyhEUExMX0NUTCkgJiAweDAwMDBmZjAwCisKKwltb3YJcjMsICNJT19BRERSRVNTKEFSTV9DS0NUTCkgJiAweGZmMDAwMDAwCisJb3JyCXIzLCByMywgI0lPX0FERFJFU1MoQVJNX0NLQ1RMKSAmIDB4MDBmZjAwMDAKKwlvcnIJcjMsIHIzLCAjSU9fQUREUkVTUyhBUk1fQ0tDVEwpICYgMHgwMDAwZmYwMAorCisJdHN0CXIwLCAjMSA8PCA0CQkJQCB3YW50IGxvY2sgbW9kZT8KKwliZXEJbmV3Y2sJCQkJQCBub3BlCisJYmljCXIwLCByMCwgIzEgPDwgNAkJCUAgZWxzZSBjbGVhciBsb2NrIGJpdAorCXN0cmgJcjAsIFtyMl0JCQlAIHNldCBkcGxsIGludG8gYnlwYXNzIG1vZGUKKwlvcnIJcjAsIHIwLCAjMSA8PCA0CQkJQCBzZXQgbG9jayBiaXQgYWdhaW4KKworbmV3Y2s6CisJc3RyaAlyMSwgW3IzXQkJCUAgd3JpdGUgbmV3IGNrY3RsIHZhbHVlCisJc3RyaAlyMCwgW3IyXQkJCUAgd3JpdGUgbmV3IGRwbGwgdmFsdWUKKworCW1vdglyNCwgIzB4MDcwMAkJCUAgbGV0IHRoZSBjbG9ja3Mgc2V0dGxlCisJb3JyCXI0LCByNCwgIzB4MDBmZgorZGVsYXk6CXN1YglyNCwgcjQsICMxCisJY21wCXI0LCAjMAorCWJuZQlkZWxheQorCitsb2NrOglsZHJoCXI0LCBbcjJdLCAjMAkJCUAgcmVhZCBiYWNrIGRwbGwgdmFsdWUKKwl0c3QJcjAsICMxIDw8IDQJCQlAIHdhbnQgbG9jayBtb2RlPworCWJlcQlvdXQJCQkJQCBub3BlCisJdHN0CXI0LCAjMSA8PCAwCQkJQCBkcGxsIHJhdGUgbG9ja2VkPworCWJlcQlsb2NrCQkJCUAgdHJ5IGFnYWluCisKK291dDoKKwlsZG1mZAlzcCEsIHtyMCAtIHIxMiwgcGN9CQlAIHJlc3RvcmUgcmVncyBhbmQgcmV0dXJuCitFTlRSWShzcmFtX3JlcHJvZ3JhbV9jbG9ja19zeikKKwkud29yZAkuIC0gc3JhbV9yZXByb2dyYW1fY2xvY2sKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTlhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogbGludXgvYXJjaC9hcm0vcGxhdC1vbWFwL3NyYW0uYworICoKKyAqIE9NQVAgU1JBTSBkZXRlY3Rpb24gYW5kIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqIFdyaXR0ZW4gYnkgVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorCisjaW5jbHVkZSAic3JhbS5oIgorCisjZGVmaW5lIE9NQVAxX1NSQU1fQkFTRQkJMHhkMDAwMDAwMAorI2RlZmluZSBPTUFQMV9TUkFNX1NUQVJUCTB4MjAwMDAwMDAKKyNkZWZpbmUgU1JBTV9CT09UTE9BREVSX1NaCTB4ODAKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgb21hcF9zcmFtX2Jhc2U7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwX3NyYW1fc2l6ZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9tYXBfc3JhbV9jZWlsOworCisvKgorICogVGhlIGFtb3VudCBvZiBTUkFNIGRlcGVuZHMgb24gdGhlIGNvcmUgdHlwZToKKyAqIDczMCA9IDIwMEssIDE1MTAgPSA1MTJLLCA1OTEyID0gMjU2SywgMTYxMCA9IDE2SywgMTcxMCA9IDE2SworICogTm90ZSB0aGF0IHdlIGNhbm5vdCB0cnkgdG8gdGVzdCBmb3IgU1JBTSBoZXJlIGJlY2F1c2Ugd3JpdGVzCisgKiB0byBzZWN1cmUgU1JBTSB3aWxsIGhhbmcgdGhlIHN5c3RlbS4gQWxzbyB0aGUgU1JBTSBpcyBub3QKKyAqIHlldCBtYXBwZWQgYXQgdGhpcyBwb2ludC4KKyAqLwordm9pZCBfX2luaXQgb21hcF9kZXRlY3Rfc3JhbSh2b2lkKQoreworCW9tYXBfc3JhbV9iYXNlID0gT01BUDFfU1JBTV9CQVNFOworCisJaWYgKGNwdV9pc19vbWFwNzMwKCkpCisJCW9tYXBfc3JhbV9zaXplID0gMHgzMjAwMDsKKwllbHNlIGlmIChjcHVfaXNfb21hcDE1MTAoKSkKKwkJb21hcF9zcmFtX3NpemUgPSAweDgwMDAwOworCWVsc2UgaWYgKGNwdV9pc19vbWFwMTYxMCgpIHx8IGNwdV9pc19vbWFwMTYyMSgpIHx8IGNwdV9pc19vbWFwMTcxMCgpKQorCQlvbWFwX3NyYW1fc2l6ZSA9IDB4NDAwMDsKKwllbHNlIGlmIChjcHVfaXNfb21hcDE2MTEoKSkKKwkJb21hcF9zcmFtX3NpemUgPSAweDNlODAwOworCWVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBkZXRlY3QgU1JBTSBzaXplXG4iKTsKKwkJb21hcF9zcmFtX3NpemUgPSAweDQwMDA7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiU1JBTSBzaXplOiAweCVseFxuIiwgb21hcF9zcmFtX3NpemUpOworCW9tYXBfc3JhbV9jZWlsID0gb21hcF9zcmFtX2Jhc2UgKyBvbWFwX3NyYW1fc2l6ZTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBvbWFwX3NyYW1faW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7CisJeyBPTUFQMV9TUkFNX0JBU0UsIE9NQVAxX1NSQU1fU1RBUlQsIDAsIE1UX0RFVklDRSB9Cit9OworCisvKgorICogSW4gb3JkZXIgdG8gdXNlIGxhc3QgMmtCIG9mIFNSQU0gb24gMTYxMWIsIHdlIG11c3Qgcm91bmQgdGhlIHNpemUKKyAqIHVwIHRvIG11bHRpcGxlIG9mIFBBR0VfU0laRS4gV2UgY2Fubm90IHVzZSBpb3JlbWFwIGZvciBTUkFNLCBhcworICogY2xvY2sgaW5pdCBuZWVkcyBTUkFNIGVhcmx5LgorICovCit2b2lkIF9faW5pdCBvbWFwX21hcF9zcmFtKHZvaWQpCit7CisJaWYgKG9tYXBfc3JhbV9zaXplID09IDApCisJCXJldHVybjsKKworCW9tYXBfc3JhbV9pb19kZXNjWzBdLmxlbmd0aCA9IChvbWFwX3NyYW1fc2l6ZSArIFBBR0VfU0laRS0xKS9QQUdFX1NJWkU7CisJb21hcF9zcmFtX2lvX2Rlc2NbMF0ubGVuZ3RoICo9IFBBR0VfU0laRTsKKwlpb3RhYmxlX2luaXQob21hcF9zcmFtX2lvX2Rlc2MsIEFSUkFZX1NJWkUob21hcF9zcmFtX2lvX2Rlc2MpKTsKKworCS8qCisJICogTG9va3MgbGlrZSB3ZSBuZWVkIHRvIHByZXNlcnZlIHNvbWUgYm9vdGxvYWRlciBjb2RlIGF0IHRoZQorCSAqIGJlZ2lubmluZyBvZiBTUkFNIGZvciBqdW1waW5nIHRvIGZsYXNoIGZvciByZWJvb3QgdG8gd29yay4uLgorCSAqLworCW1lbXNldCgodm9pZCAqKW9tYXBfc3JhbV9iYXNlICsgU1JBTV9CT09UTE9BREVSX1NaLCAwLAorCSAgICAgICBvbWFwX3NyYW1fc2l6ZSAtIFNSQU1fQk9PVExPQURFUl9TWik7Cit9CisKK3N0YXRpYyB2b2lkICgqX29tYXBfc3JhbV9yZXByb2dyYW1fY2xvY2spKHUzMiBkcGxsY3RsLCB1MzIgY2tjdGwpID0gTlVMTDsKKwordm9pZCBvbWFwX3NyYW1fcmVwcm9ncmFtX2Nsb2NrKHUzMiBkcGxsY3RsLCB1MzIgY2tjdGwpCit7CisJaWYgKF9vbWFwX3NyYW1fcmVwcm9ncmFtX2Nsb2NrID09IE5VTEwpCisJCXBhbmljKCJDYW5ub3QgdXNlIFNSQU0iKTsKKworCXJldHVybiBfb21hcF9zcmFtX3JlcHJvZ3JhbV9jbG9jayhkcGxsY3RsLCBja2N0bCk7Cit9CisKK3ZvaWQgKiBvbWFwX3NyYW1fcHVzaCh2b2lkICogc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAoc2l6ZSA+IChvbWFwX3NyYW1fY2VpbCAtIChvbWFwX3NyYW1fYmFzZSArIFNSQU1fQk9PVExPQURFUl9TWikpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTm90IGVub3VnaCBzcGFjZSBpbiBTUkFNXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW9tYXBfc3JhbV9jZWlsIC09IHNpemU7CisJb21hcF9zcmFtX2NlaWwgJj0gfjB4MzsKKwltZW1jcHkoKHZvaWQgKilvbWFwX3NyYW1fY2VpbCwgc3RhcnQsIHNpemUpOworCisJcmV0dXJuICh2b2lkICopb21hcF9zcmFtX2NlaWw7Cit9CisKK3ZvaWQgX19pbml0IG9tYXBfc3JhbV9pbml0KHZvaWQpCit7CisJb21hcF9kZXRlY3Rfc3JhbSgpOworCW9tYXBfbWFwX3NyYW0oKTsKKwlfb21hcF9zcmFtX3JlcHJvZ3JhbV9jbG9jayA9IG9tYXBfc3JhbV9wdXNoKHNyYW1fcmVwcm9ncmFtX2Nsb2NrLAorCQkJCQkJICAgIHNyYW1fcmVwcm9ncmFtX2Nsb2NrX3N6KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9zcmFtLmggYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTg0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBsaW51eC9hcmNoL2FybS9wbGF0LW9tYXAvc3JhbS5oCisgKgorICogSW50ZXJmYWNlIGZvciBmdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIHJ1biBpbiBpbnRlcm5hbCBTUkFNCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fQVJDSF9BUk1fT01BUF9TUkFNX0gKKyNkZWZpbmUgX19BUkNIX0FSTV9PTUFQX1NSQU1fSAorCitleHRlcm4gdm9pZCAqIG9tYXBfc3JhbV9wdXNoKHZvaWQgKiBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKK2V4dGVybiB2b2lkIG9tYXBfc3JhbV9yZXByb2dyYW1fY2xvY2sodTMyIGRwbGxjdGwsIHUzMiBja2N0bCk7CisKKy8qIERvIG5vdCB1c2UgdGhlc2UgKi8KK2V4dGVybiB2b2lkIHNyYW1fcmVwcm9ncmFtX2Nsb2NrKHUzMiBja2N0bCwgdTMyIGRwbGxjdGwpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3JhbV9yZXByb2dyYW1fY2xvY2tfc3o7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jCmluZGV4IDI1YmM0YTguLjk4ZjFjNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC91c2IuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMKQEAgLTQxLDYgKzQxLDcgQEAKIAogLyogVGhlc2Ugcm91dGluZXMgc2hvdWxkIGhhbmRsZSB0aGUgc3RhbmRhcmQgY2hpcC1zcGVjaWZpYyBtb2RlcwogICogZm9yIHVzYjAvMS8yIHBvcnRzLCBjb3ZlcmluZyBiYXNpYyBtdXggYW5kIHRyYW5zY2VpdmVyIHNldHVwLgorICogQ2FsbCBvbWFwX3VzYl9pbml0KCkgb25jZSwgZnJvbSBJTklUX01BQ0hJTkUoKS4KICAqCiAgKiBTb21lIGJvYXJkLSouYyBmaWxlcyB3aWxsIG5lZWQgdG8gc2V0IHVwIGFkZGl0aW9uYWwgbXV4IG9wdGlvbnMsCiAgKiBsaWtlIGZvciBzdXNwZW5kIGhhbmRsaW5nLCB2YnVzIHNlbnNpbmcsIEdQSU9zLCBhbmQgdGhlIEQrIHB1bGx1cC4K