Ci8qCiAqIElCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRGV2aWNlIERyaXZlcgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogKgogKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogKgogKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KCi8qIERyaXZlciBpZGVudGlmaWNhdGlvbiAqLwojZGVmaW5lIERSSVZFUl9OQU1FCSJpYm1hc20iCiNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gICIxLjAiCiNkZWZpbmUgRFJJVkVSX0FVVEhPUiAgICJNYXggQXNib2NrIDxtYXNib2NrQHVzLmlibS5jb20+LCBWZXJub24gTWF1ZXJ5IDx2ZXJudXhAdXMuaWJtLmNvbT4iCiNkZWZpbmUgRFJJVkVSX0RFU0MgICAgICJJQk0gQVNNIFNlcnZpY2UgUHJvY2Vzc29yIERyaXZlciIKCiNkZWZpbmUgZXJyKG1zZykgcHJpbnRrKEtFUk5fRVJSICIlczogIiBtc2cgIlxuIiwgRFJJVkVSX05BTUUpCiNkZWZpbmUgaW5mbyhtc2cpIHByaW50ayhLRVJOX0lORk8gIiVzOiAiIG1zZyAiXG4iLCBEUklWRVJfTkFNRSkKCmV4dGVybiBpbnQgaWJtYXNtX2RlYnVnOwojZGVmaW5lIGRiZyhTVFIsIEFSR1MuLi4pCQkJCQlcCglkbyB7CQkJCQkJCVwKCQlpZiAoaWJtYXNtX2RlYnVnKQkJCQlcCgkJCXByaW50ayhLRVJOX0RFQlVHIFNUUiAsICMjQVJHUyk7CVwKCX0gd2hpbGUgKDApCgpzdGF0aWMgaW5saW5lIGNoYXIgKmdldF90aW1lc3RhbXAoY2hhciAqYnVmKQp7CglzdHJ1Y3QgdGltZXZhbCBub3c7Cglkb19nZXR0aW1lb2ZkYXkoJm5vdyk7CglzcHJpbnRmKGJ1ZiwgIiVsdS4lbHUiLCBub3cudHZfc2VjLCBub3cudHZfdXNlYyk7CglyZXR1cm4gYnVmOwp9CgojZGVmaW5lIElCTUFTTV9DTURfUEVORElORwkwCQojZGVmaW5lIElCTUFTTV9DTURfQ09NUExFVEUJMQkKI2RlZmluZSBJQk1BU01fQ01EX0ZBSUxFRAkyCgojZGVmaW5lIElCTUFTTV9DTURfVElNRU9VVF9OT1JNQUwJNDUKI2RlZmluZSBJQk1BU01fQ01EX1RJTUVPVVRfRVhUUkEJMjQwCgojZGVmaW5lIElCTUFTTV9DTURfTUFYX0JVRkZFUl9TSVpFCTB4ODAwMAoKI2RlZmluZSBSRVZFUlNFX0hFQVJUQkVBVF9USU1FT1VUCTEyMAoKI2RlZmluZSBIRUFSVEJFQVRfQlVGRkVSX1NJWkUJCTB4NDAwCgojaWZkZWYgSUE2NAojZGVmaW5lIElCTUFTTV9EUklWRVJfVlBEICJMaW42NCA2LjA4ICAgICAgIgojZWxzZQojZGVmaW5lIElCTUFTTV9EUklWRVJfVlBEICJMaW4zMiA2LjA4ICAgICAgIgojZW5kaWYKCiNkZWZpbmUgU1lTVEVNX1NUQVRFX09TX1VQICAgICAgNQojZGVmaW5lIFNZU1RFTV9TVEFURV9PU19ET1dOICAgIDQKCiNkZWZpbmUgSUJNQVNNX05BTUVfU0laRQkxNgoKI2RlZmluZSBJQk1BU01fTlVNX0VWRU5UUwkxMAojZGVmaW5lIElCTUFTTV9FVkVOVF9NQVhfU0laRQkyMDQ4dQoKCnN0cnVjdCBjb21tYW5kIHsKCXN0cnVjdCBsaXN0X2hlYWQJcXVldWVfbm9kZTsKCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7Cgl1bnNpZ25lZCBjaGFyCQkqYnVmZmVyOwoJc2l6ZV90CQkJYnVmZmVyX3NpemU7CglpbnQJCQlzdGF0dXM7CglzdHJ1Y3Qga29iamVjdAkJa29iajsKCXNwaW5sb2NrX3QJCSpsb2NrOwp9OwojZGVmaW5lIHRvX2NvbW1hbmQoYykgY29udGFpbmVyX29mKGMsIHN0cnVjdCBjb21tYW5kLCBrb2JqKQoKc3RhdGljIGlubGluZSB2b2lkIGNvbW1hbmRfcHV0KHN0cnVjdCBjb21tYW5kICpjbWQpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglzcGlubG9ja190ICpsb2NrID0gY21kLT5sb2NrOwoKCXNwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsKCWtvYmplY3RfcHV0KCZjbWQtPmtvYmopOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjb21tYW5kX2dldChzdHJ1Y3QgY29tbWFuZCAqY21kKQp7Cglrb2JqZWN0X2dldCgmY21kLT5rb2JqKTsKfQoKCnN0cnVjdCBpYm1hc21fZXZlbnQgewoJdW5zaWduZWQgaW50CXNlcmlhbF9udW1iZXI7Cgl1bnNpZ25lZCBpbnQJZGF0YV9zaXplOwoJdW5zaWduZWQgY2hhcglkYXRhW0lCTUFTTV9FVkVOVF9NQVhfU0laRV07Cn07CgpzdHJ1Y3QgZXZlbnRfYnVmZmVyIHsKCXN0cnVjdCBpYm1hc21fZXZlbnQJZXZlbnRzW0lCTUFTTV9OVU1fRVZFTlRTXTsKCXVuc2lnbmVkIGludAkJbmV4dF9zZXJpYWxfbnVtYmVyOwoJdW5zaWduZWQgaW50CQluZXh0X2luZGV4OwoJc3RydWN0IGxpc3RfaGVhZAlyZWFkZXJzOwp9OwoKc3RydWN0IGV2ZW50X3JlYWRlciB7CglpbnQJCQljYW5jZWxsZWQ7Cgl1bnNpZ25lZCBpbnQJCW5leHRfc2VyaWFsX251bWJlcjsKCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7CglzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7Cgl1bnNpZ25lZCBpbnQJCWRhdGFfc2l6ZTsKCXVuc2lnbmVkIGNoYXIJCWRhdGFbSUJNQVNNX0VWRU5UX01BWF9TSVpFXTsKfTsKCnN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCB7Cgl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OwoJdW5zaWduZWQgaW50CQlzdG9wcGVkOwp9OwoKc3RydWN0IGlibWFzbV9yZW1vdGUgewoJc3RydWN0IGlucHV0X2RldiAqa2V5YmRfZGV2OwoJc3RydWN0IGlucHV0X2RldiAqbW91c2VfZGV2Owp9OwoKc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yIHsKCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKCXNwaW5sb2NrX3QJCWxvY2s7Cgl2b2lkIF9faW9tZW0JCSpiYXNlX2FkZHJlc3M7Cgl1bnNpZ25lZCBpbnQJCWlycTsKCXN0cnVjdCBjb21tYW5kCQkqY3VycmVudF9jb21tYW5kOwoJc3RydWN0IGNvbW1hbmQJCSpoZWFydGJlYXQ7CglzdHJ1Y3QgbGlzdF9oZWFkCWNvbW1hbmRfcXVldWU7CglzdHJ1Y3QgZXZlbnRfYnVmZmVyCSpldmVudF9idWZmZXI7CgljaGFyCQkJZGlybmFtZVtJQk1BU01fTkFNRV9TSVpFXTsKCWNoYXIJCQlkZXZuYW1lW0lCTUFTTV9OQU1FX1NJWkVdOwoJdW5zaWduZWQgaW50CQludW1iZXI7CglzdHJ1Y3QgaWJtYXNtX3JlbW90ZQlyZW1vdGU7CglpbnQJCQlzZXJpYWxfbGluZTsKCXN0cnVjdCBkZXZpY2UJCSpkZXY7Cn07CgovKiBjb21tYW5kIHByb2Nlc3NpbmcgKi8KZXh0ZXJuIHN0cnVjdCBjb21tYW5kICppYm1hc21fbmV3X2NvbW1hbmQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc2l6ZV90IGJ1ZmZlcl9zaXplKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX2V4ZWNfY29tbWFuZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgY29tbWFuZCAqY21kKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3dhaXRfZm9yX3Jlc3BvbnNlKHN0cnVjdCBjb21tYW5kICpjbWQsIGludCB0aW1lb3V0KTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3JlY2VpdmVfY29tbWFuZF9yZXNwb25zZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCB2b2lkICpyZXNwb25zZSwgIHNpemVfdCBzaXplKTsKCi8qIGV2ZW50IHByb2Nlc3NpbmcgKi8KZXh0ZXJuIGludCBpYm1hc21fZXZlbnRfYnVmZmVyX2luaXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiB2b2lkIGlibWFzbV9ldmVudF9idWZmZXJfZXhpdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3JlY2VpdmVfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgIHVuc2lnbmVkIGludCBkYXRhX3NpemUpOwpleHRlcm4gdm9pZCBpYm1hc21fZXZlbnRfcmVhZGVyX3JlZ2lzdGVyKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CmV4dGVybiB2b2lkIGlibWFzbV9ldmVudF9yZWFkZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwpleHRlcm4gaW50IGlibWFzbV9nZXRfbmV4dF9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwpleHRlcm4gdm9pZCBpYm1hc21fY2FuY2VsX25leHRfZXZlbnQoc3RydWN0IGV2ZW50X3JlYWRlciAqcmVhZGVyKTsKCi8qIGhlYXJ0YmVhdCAtIGZyb20gU1AgdG8gT1MgKi8KZXh0ZXJuIHZvaWQgaWJtYXNtX3JlZ2lzdGVyX3BhbmljX25vdGlmaWVyKHZvaWQpOwpleHRlcm4gdm9pZCBpYm1hc21fdW5yZWdpc3Rlcl9wYW5pY19ub3RpZmllcih2b2lkKTsKZXh0ZXJuIGludCBpYm1hc21faGVhcnRiZWF0X2luaXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiB2b2lkIGlibWFzbV9oZWFydGJlYXRfZXhpdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3JlY2VpdmVfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsICB2b2lkICptZXNzYWdlLCBzaXplX3Qgc2l6ZSk7CgovKiByZXZlcnNlIGhlYXJ0YmVhdCAtIGZyb20gT1MgdG8gU1AgKi8KZXh0ZXJuIHZvaWQgaWJtYXNtX2luaXRfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwpleHRlcm4gaW50IGlibWFzbV9zdGFydF9yZXZlcnNlX2hlYXJ0YmVhdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgcmV2ZXJzZV9oZWFydGJlYXQgKnJoYik7CmV4dGVybiB2b2lkIGlibWFzbV9zdG9wX3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKTsKCi8qIGRvdCBjb21tYW5kcyAqLwpleHRlcm4gdm9pZCBpYm1hc21fcmVjZWl2ZV9tZXNzYWdlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHZvaWQgKmRhdGEsIGludCBkYXRhX3NpemUpOwpleHRlcm4gaW50IGlibWFzbV9zZW5kX2RyaXZlcl92cGQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiBpbnQgaWJtYXNtX3NlbmRfb3Nfc3RhdGUoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgaW50IG9zX3N0YXRlKTsKCi8qIGxvdyBsZXZlbCBtZXNzYWdlIHByb2Nlc3NpbmcgKi8KZXh0ZXJuIGludCBpYm1hc21fc2VuZF9pMm9fbWVzc2FnZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIGlycXJldHVybl90IGlibWFzbV9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICogZGV2X2lkKTsKCi8qIHJlbW90ZSBjb25zb2xlICovCmV4dGVybiB2b2lkIGlibWFzbV9oYW5kbGVfbW91c2VfaW50ZXJydXB0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gaW50IGlibWFzbV9pbml0X3JlbW90ZV9pbnB1dF9kZXYoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiB2b2lkIGlibWFzbV9mcmVlX3JlbW90ZV9pbnB1dF9kZXYoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CgovKiBmaWxlIHN5c3RlbSAqLwpleHRlcm4gaW50IGlibWFzbWZzX3JlZ2lzdGVyKHZvaWQpOwpleHRlcm4gdm9pZCBpYm1hc21mc191bnJlZ2lzdGVyKHZvaWQpOwpleHRlcm4gdm9pZCBpYm1hc21mc19hZGRfc3Aoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CgovKiB1YXJ0ICovCiNpZmRlZiBDT05GSUdfU0VSSUFMXzgyNTAKZXh0ZXJuIHZvaWQgaWJtYXNtX3JlZ2lzdGVyX3VhcnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiB2b2lkIGlibWFzbV91bnJlZ2lzdGVyX3VhcnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CiNlbHNlCiNkZWZpbmUgaWJtYXNtX3JlZ2lzdGVyX3VhcnQoc3ApCWRvIHsgfSB3aGlsZSgwKQojZGVmaW5lIGlibWFzbV91bnJlZ2lzdGVyX3VhcnQoc3ApCWRvIHsgfSB3aGlsZSgwKQojZW5kaWYK