LyoKICAgIGkyYy12aWEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgIExpbnV4IGtlcm5lbCBtb2R1bGVzCiAgICAgICAgICAgICAgICBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwoKICAgIGkyYyBTdXBwb3J0IGZvciBWaWEgVGVjaG5vbG9naWVzIDgyQzU4NkIgU291dGggQnJpZGdlCgogICAgQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoqLwoKI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgoKLyogUG93ZXIgbWFuYWdlbWVudCByZWdpc3RlcnMgKi8KI2RlZmluZSBQTV9DRkdfUkVWSUQJMHgwOAkvKiBzaWxpY29uIHJldmlzaW9uIGNvZGUgKi8KI2RlZmluZSBQTV9DRkdfSU9CQVNFMAkweDIwCiNkZWZpbmUgUE1fQ0ZHX0lPQkFTRTEJMHg0OAoKI2RlZmluZSBJMkNfRElSCQkocG1faW9fYmFzZSsweDQwKQojZGVmaW5lIEkyQ19PVVQJCShwbV9pb19iYXNlKzB4NDIpCiNkZWZpbmUgSTJDX0lOCQkocG1faW9fYmFzZSsweDQ0KQojZGVmaW5lIEkyQ19TQ0wJCTB4MDIJLyogY2xvY2sgYml0IGluIERJUi9PVVQvSU4gcmVnaXN0ZXIgKi8KI2RlZmluZSBJMkNfU0RBCQkweDA0CgovKiBpby1yZWdpb24gcmVzZXJ2YXRpb24gKi8KI2RlZmluZSBJT1NQQUNFCQkweDA2CgpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdnQ1ODZiX2RyaXZlcjsKc3RhdGljIHUxNiBwbV9pb19iYXNlOwoKLyoKICAgSXQgZG9lcyBub3QgYXBwZWFyIGZyb20gdGhlIGRhdGFzaGVldCB0aGF0IHRoZSBHUElPIHBpbnMgYXJlCiAgIG9wZW4gZHJhaW4uIFNvIGEgd2Ugc2V0IGEgbG93IHZhbHVlIGJ5IHNldHRpbmcgdGhlIGRpcmVjdGlvbiB0bwogICBvdXRwdXQgYW5kIGEgaGlnaCB2YWx1ZSBieSBzZXR0aW5nIHRoZSBkaXJlY3Rpb24gdG8gaW5wdXQgYW5kCiAgIHJlbHlpbmcgb24gdGhlIHJlcXVpcmVkIEkyQyBwdWxsdXAuIFRoZSBkYXRhIHZhbHVlIGlzIGluaXRpYWxpemVkCiAgIHRvIDAgaW4gdmlhX2luaXQoKSBhbmQgbmV2ZXIgY2hhbmdlZC4KKi8Kc3RhdGljIHZvaWQgYml0X3ZpYV9zZXRzY2wodm9pZCAqZGF0YSwgaW50IHN0YXRlKQp7CglvdXRiKHN0YXRlID8gaW5iKEkyQ19ESVIpICYgfkkyQ19TQ0wgOiBpbmIoSTJDX0RJUikgfCBJMkNfU0NMLCBJMkNfRElSKTsKfQoKc3RhdGljIHZvaWQgYml0X3ZpYV9zZXRzZGEodm9pZCAqZGF0YSwgaW50IHN0YXRlKQp7CglvdXRiKHN0YXRlID8gaW5iKEkyQ19ESVIpICYgfkkyQ19TREEgOiBpbmIoSTJDX0RJUikgfCBJMkNfU0RBLCBJMkNfRElSKTsKfQoKc3RhdGljIGludCBiaXRfdmlhX2dldHNjbCh2b2lkICpkYXRhKQp7CglyZXR1cm4gKDAgIT0gKGluYihJMkNfSU4pICYgSTJDX1NDTCkpOwp9CgpzdGF0aWMgaW50IGJpdF92aWFfZ2V0c2RhKHZvaWQgKmRhdGEpCnsKCXJldHVybiAoMCAhPSAoaW5iKEkyQ19JTikgJiBJMkNfU0RBKSk7Cn0KCgpzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGJpdF9kYXRhID0gewoJLnNldHNkYQkJPSBiaXRfdmlhX3NldHNkYSwKCS5zZXRzY2wJCT0gYml0X3ZpYV9zZXRzY2wsCgkuZ2V0c2RhCQk9IGJpdF92aWFfZ2V0c2RhLAoJLmdldHNjbAkJPSBiaXRfdmlhX2dldHNjbCwKCS51ZGVsYXkJCT0gNSwKCS5tZGVsYXkJCT0gNSwKCS50aW1lb3V0CT0gSFoKfTsKCnN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgdnQ1ODZiX2FkYXB0ZXIgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkuY2xhc3MgICAgICAgICAgPSBJMkNfQ0xBU1NfSFdNT04sCgkubmFtZQkJPSAiVklBIGkyYyIsCgkuYWxnb19kYXRhCT0gJmJpdF9kYXRhLAp9OwoKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2dDU4NmJfaWRzW10gX19kZXZpbml0ZGF0YSA9IHsKCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzMpIH0sCgl7IDAsIH0KfTsKCk1PRFVMRV9ERVZJQ0VfVEFCTEUgKHBjaSwgdnQ1ODZiX2lkcyk7CgpzdGF0aWMgaW50IF9fZGV2aW5pdCB2dDU4NmJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQp7Cgl1MTYgYmFzZTsKCXU4IHJldjsKCWludCByZXM7CgoJaWYgKHBtX2lvX2Jhc2UpIHsKCQlkZXZfZXJyKCZkZXYtPmRldiwgImkyYy12aWE6IFdpbGwgb25seSBzdXBwb3J0IG9uZSBob3N0XG4iKTsKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBNX0NGR19SRVZJRCwgJnJldik7CgoJc3dpdGNoIChyZXYpIHsKCWNhc2UgMHgwMDoKCQliYXNlID0gUE1fQ0ZHX0lPQkFTRTA7CgkJYnJlYWs7CgljYXNlIDB4MDE6CgljYXNlIDB4MTA6CgkJYmFzZSA9IFBNX0NGR19JT0JBU0UxOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJYmFzZSA9IFBNX0NGR19JT0JBU0UxOwoJCS8qIGxhdGVyIHJldmlzaW9uICovCgl9CgoJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBiYXNlLCAmcG1faW9fYmFzZSk7CglwbV9pb19iYXNlICY9ICgweGZmIDw8IDgpOwoKCWlmICghcmVxdWVzdF9yZWdpb24oSTJDX0RJUiwgSU9TUEFDRSwgdnQ1ODZiX2RyaXZlci5uYW1lKSkgewoJCWRldl9lcnIoJmRldi0+ZGV2LCAiSU8gMHgleC0weCV4IGFscmVhZHkgaW4gdXNlXG4iLCBJMkNfRElSLCBJMkNfRElSICsgSU9TUEFDRSk7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJb3V0YihpbmIoSTJDX0RJUikgJiB+KEkyQ19TREEgfCBJMkNfU0NMKSwgSTJDX0RJUik7CglvdXRiKGluYihJMkNfT1VUKSAmIH4oSTJDX1NEQSB8IEkyQ19TQ0wpLCBJMkNfT1VUKTsKCgkvKiBzZXQgdXAgdGhlIGRyaXZlcmZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KCXZ0NTg2Yl9hZGFwdGVyLmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CgoJcmVzID0gaTJjX2JpdF9hZGRfYnVzKCZ2dDU4NmJfYWRhcHRlcik7CglpZiAoIHJlcyA8IDAgKSB7CgkJcmVsZWFzZV9yZWdpb24oSTJDX0RJUiwgSU9TUEFDRSk7CgkJcG1faW9fYmFzZSA9IDA7CgkJcmV0dXJuIHJlczsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBfX2RldmV4aXQgdnQ1ODZiX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQp7CglpMmNfYml0X2RlbF9idXMoJnZ0NTg2Yl9hZGFwdGVyKTsKCXJlbGVhc2VfcmVnaW9uKEkyQ19ESVIsIElPU1BBQ0UpOwoJcG1faW9fYmFzZSA9IDA7Cn0KCgpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdnQ1ODZiX2RyaXZlciA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5uYW1lCQk9ICJ2dDU4NmJfc21idXMiLAoJLmlkX3RhYmxlCT0gdnQ1ODZiX2lkcywKCS5wcm9iZQkJPSB2dDU4NmJfcHJvYmUsCgkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHZ0NTg2Yl9yZW1vdmUpLAp9OwoKc3RhdGljIGludCBfX2luaXQgaTJjX3Z0NTg2Yl9pbml0KHZvaWQpCnsKCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ2dDU4NmJfZHJpdmVyKTsKfQoKc3RhdGljIHZvaWQgX19leGl0IGkyY192dDU4NmJfZXhpdCh2b2lkKQp7CglwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZ0NTg2Yl9kcml2ZXIpOwp9CgoKTU9EVUxFX0FVVEhPUigiS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiaTJjIGZvciBWaWEgdnQ4MmM1ODZiIHNvdXRoYnJpZGdlIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9pbml0KGkyY192dDU4NmJfaW5pdCk7Cm1vZHVsZV9leGl0KGkyY192dDU4NmJfZXhpdCk7Cg==