Ci8qCiAqIElCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRGV2aWNlIERyaXZlcgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogKgogKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogKgogKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCiAqCiAqLwoKI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CgovKiBEcml2ZXIgaWRlbnRpZmljYXRpb24gKi8KI2RlZmluZSBEUklWRVJfTkFNRQkiaWJtYXNtIgojZGVmaW5lIERSSVZFUl9WRVJTSU9OICAiMC40IgojZGVmaW5lIERSSVZFUl9BVVRIT1IgICAiTWF4IEFzYm9jayIKI2RlZmluZSBEUklWRVJfREVTQyAgICAgIklCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRHJpdmVyIgoKI2RlZmluZSBlcnIobXNnKSBwcmludGsoS0VSTl9FUlIgIiVzOiAiIG1zZyAiXG4iLCBEUklWRVJfTkFNRSkKI2RlZmluZSBpbmZvKG1zZykgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgbXNnICJcbiIsIERSSVZFUl9OQU1FKQoKCiNkZWZpbmUgSUJNQVNNX0NNRF9QRU5ESU5HCTAJCiNkZWZpbmUgSUJNQVNNX0NNRF9DT01QTEVURQkxCQojZGVmaW5lIElCTUFTTV9DTURfRkFJTEVECTIKCiNkZWZpbmUgSUJNQVNNX0NNRF9USU1FT1VUX05PUk1BTAk0NQojZGVmaW5lIElCTUFTTV9DTURfVElNRU9VVF9FWFRSQQkyNDAKCiNkZWZpbmUgSUJNQVNNX0NNRF9NQVhfQlVGRkVSX1NJWkUJMHg0MDAwCgojZGVmaW5lIFJFVkVSU0VfSEVBUlRCRUFUX1RJTUVPVVQJMTIwCgojZGVmaW5lIEhFQVJUQkVBVF9CVUZGRVJfU0laRQkJMHg0MDAKCiNpZmRlZiBJQTY0CiNkZWZpbmUgSUJNQVNNX0RSSVZFUl9WUEQgIkxpbjY0IDYuMDggICAgICAiCiNlbHNlCiNkZWZpbmUgSUJNQVNNX0RSSVZFUl9WUEQgIkxpbjMyIDYuMDggICAgICAiCiNlbmRpZgoKI2RlZmluZSBTWVNURU1fU1RBVEVfT1NfVVAgICAgICA1CiNkZWZpbmUgU1lTVEVNX1NUQVRFX09TX0RPV04gICAgNAoKI2RlZmluZSBJQk1BU01fTkFNRV9TSVpFCTE2CgojZGVmaW5lIElCTUFTTV9OVU1fRVZFTlRTCTEwCiNkZWZpbmUgSUJNQVNNX0VWRU5UX01BWF9TSVpFCTIwNDh1CgoKc3RydWN0IGNvbW1hbmQgewoJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZV9ub2RlOwoJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKCXVuc2lnbmVkIGNoYXIJCSpidWZmZXI7CglzaXplX3QJCQlidWZmZXJfc2l6ZTsKCWludAkJCXN0YXR1czsKCXN0cnVjdCBrb2JqZWN0CQlrb2JqOwp9OwojZGVmaW5lIHRvX2NvbW1hbmQoYykgY29udGFpbmVyX29mKGMsIHN0cnVjdCBjb21tYW5kLCBrb2JqKQoKc3RhdGljIGlubGluZSB2b2lkIGNvbW1hbmRfcHV0KHN0cnVjdCBjb21tYW5kICpjbWQpCnsKICAgICAgICBrb2JqZWN0X3B1dCgmY21kLT5rb2JqKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNvbW1hbmRfZ2V0KHN0cnVjdCBjb21tYW5kICpjbWQpCnsKICAgICAgICBrb2JqZWN0X2dldCgmY21kLT5rb2JqKTsKfQoKCnN0cnVjdCBpYm1hc21fZXZlbnQgewoJdW5zaWduZWQgaW50CXNlcmlhbF9udW1iZXI7Cgl1bnNpZ25lZCBpbnQJZGF0YV9zaXplOwoJdW5zaWduZWQgY2hhcglkYXRhW0lCTUFTTV9FVkVOVF9NQVhfU0laRV07Cn07CgpzdHJ1Y3QgZXZlbnRfYnVmZmVyIHsKCXN0cnVjdCBpYm1hc21fZXZlbnQJZXZlbnRzW0lCTUFTTV9OVU1fRVZFTlRTXTsKCXVuc2lnbmVkIGludAkJbmV4dF9zZXJpYWxfbnVtYmVyOwoJdW5zaWduZWQgaW50CQluZXh0X2luZGV4OwoJc3RydWN0IGxpc3RfaGVhZAlyZWFkZXJzOwp9OwoKc3RydWN0IGV2ZW50X3JlYWRlciB7Cgl1bnNpZ25lZCBpbnQJCW5leHRfc2VyaWFsX251bWJlcjsKCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7CglzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7Cgl1bnNpZ25lZCBpbnQJCWRhdGFfc2l6ZTsKCXVuc2lnbmVkIGNoYXIJCWRhdGFbSUJNQVNNX0VWRU5UX01BWF9TSVpFXTsKfTsKCnN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCB7Cgl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OwoJdW5zaWduZWQgaW50CQlzdG9wcGVkOwp9OwoKCi8qIHJlbW90ZSBjb25zb2xlIGV2ZW50cyAqLwpzdHJ1Y3QgbW91c2VfZXZlbnQgewoJbG9uZwkJeDsKCWxvbmcJCXk7Cgl1bnNpZ25lZCBjaGFyCWJ1dHRvbnM7Cgl1bnNpZ25lZCBjaGFyCXRyYW5zaXRpb25zOwp9OwoKc3RydWN0IGtleWJvYXJkX2V2ZW50IHsKCXVuc2lnbmVkIGxvbmcJa2V5X2NvZGU7Cgl1bnNpZ25lZCBjaGFyCWtleV9kb3duOwp9OwoKc3RydWN0IHJlbW90ZV9ldmVudCB7Cgl1bnNpZ25lZCBsb25nCXR5cGU7Cgl1bmlvbiB7CgkJc3RydWN0IG1vdXNlX2V2ZW50CW1vdXNlOwoJCXN0cnVjdCBrZXlib2FyZF9ldmVudAlrZXlib2FyZDsKCX0gZGF0YTsKfTsKCiNkZWZpbmUgRFJJVkVSX1JFTU9URV9RVUVVRV9TSVpFIDI0MAoKc3RydWN0IHJlbW90ZV9xdWV1ZSB7CglzdHJ1Y3QgcmVtb3RlX2V2ZW50CSpzdGFydDsKCXN0cnVjdCByZW1vdGVfZXZlbnQJKmVuZDsKCXN0cnVjdCByZW1vdGVfZXZlbnQJKnJlYWRlcjsKCXN0cnVjdCByZW1vdGVfZXZlbnQJKndyaXRlcjsKCXVuc2lnbmVkIGludAkJc2l6ZTsKCWludAkJCW9wZW47Cgl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0Owp9OwoKCnN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciB7CglzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CglzcGlubG9ja190CQlsb2NrOwoJdm9pZCBfX2lvbWVtCQkqYmFzZV9hZGRyZXNzOwoJdW5zaWduZWQgaW50CQlpcnE7CglzdHJ1Y3QgY29tbWFuZAkJKmN1cnJlbnRfY29tbWFuZDsKCXN0cnVjdCBjb21tYW5kCQkqaGVhcnRiZWF0OwoJc3RydWN0IGxpc3RfaGVhZAljb21tYW5kX3F1ZXVlOwoJc3RydWN0IGV2ZW50X2J1ZmZlcgkqZXZlbnRfYnVmZmVyOwoJY2hhcgkJCWRpcm5hbWVbSUJNQVNNX05BTUVfU0laRV07CgljaGFyCQkJZGV2bmFtZVtJQk1BU01fTkFNRV9TSVpFXTsKCXVuc2lnbmVkIGludAkJbnVtYmVyOwoJc3RydWN0IHJlbW90ZV9xdWV1ZQlyZW1vdGVfcXVldWU7CglpbnQJCQlzZXJpYWxfbGluZTsKCXN0cnVjdCBkZXZpY2UJCSpkZXY7Cn07CgovKiBjb21tYW5kIHByb2Nlc3NpbmcgKi8KZXh0ZXJuIHN0cnVjdCBjb21tYW5kICppYm1hc21fbmV3X2NvbW1hbmQoc2l6ZV90IGJ1ZmZlcl9zaXplKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX2V4ZWNfY29tbWFuZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgY29tbWFuZCAqY21kKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3dhaXRfZm9yX3Jlc3BvbnNlKHN0cnVjdCBjb21tYW5kICpjbWQsIGludCB0aW1lb3V0KTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3JlY2VpdmVfY29tbWFuZF9yZXNwb25zZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCB2b2lkICpyZXNwb25zZSwgIHNpemVfdCBzaXplKTsKCi8qIGV2ZW50IHByb2Nlc3NpbmcgKi8KZXh0ZXJuIGludCBpYm1hc21fZXZlbnRfYnVmZmVyX2luaXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCk7CmV4dGVybiB2b2lkIGlibWFzbV9ldmVudF9idWZmZXJfZXhpdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3JlY2VpdmVfZXZlbnQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgIHVuc2lnbmVkIGludCBkYXRhX3NpemUpOwpleHRlcm4gdm9pZCBpYm1hc21fZXZlbnRfcmVhZGVyX3JlZ2lzdGVyKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCBldmVudF9yZWFkZXIgKnJlYWRlcik7CmV4dGVybiB2b2lkIGlibWFzbV9ldmVudF9yZWFkZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwpleHRlcm4gaW50IGlibWFzbV9nZXRfbmV4dF9ldmVudChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgZXZlbnRfcmVhZGVyICpyZWFkZXIpOwoKLyogaGVhcnRiZWF0IC0gZnJvbSBTUCB0byBPUyAqLwpleHRlcm4gdm9pZCBpYm1hc21fcmVnaXN0ZXJfcGFuaWNfbm90aWZpZXIodm9pZCk7CmV4dGVybiB2b2lkIGlibWFzbV91bnJlZ2lzdGVyX3BhbmljX25vdGlmaWVyKHZvaWQpOwpleHRlcm4gaW50IGlibWFzbV9oZWFydGJlYXRfaW5pdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX2hlYXJ0YmVhdF9leGl0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gdm9pZCBpYm1hc21fcmVjZWl2ZV9oZWFydGJlYXQoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBzaXplKTsKCi8qIHJldmVyc2UgaGVhcnRiZWF0IC0gZnJvbSBPUyB0byBTUCAqLwpleHRlcm4gdm9pZCBpYm1hc21faW5pdF9yZXZlcnNlX2hlYXJ0YmVhdChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBzdHJ1Y3QgcmV2ZXJzZV9oZWFydGJlYXQgKnJoYik7CmV4dGVybiBpbnQgaWJtYXNtX3N0YXJ0X3JldmVyc2VfaGVhcnRiZWF0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHN0cnVjdCByZXZlcnNlX2hlYXJ0YmVhdCAqcmhiKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX3N0b3BfcmV2ZXJzZV9oZWFydGJlYXQoc3RydWN0IHJldmVyc2VfaGVhcnRiZWF0ICpyaGIpOwoKLyogZG90IGNvbW1hbmRzICovCmV4dGVybiB2b2lkIGlibWFzbV9yZWNlaXZlX21lc3NhZ2Uoc3RydWN0IHNlcnZpY2VfcHJvY2Vzc29yICpzcCwgdm9pZCAqZGF0YSwgaW50IGRhdGFfc2l6ZSk7CmV4dGVybiBpbnQgaWJtYXNtX3NlbmRfZHJpdmVyX3ZwZChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIGludCBpYm1hc21fc2VuZF9vc19zdGF0ZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwLCBpbnQgb3Nfc3RhdGUpOwoKLyogbG93IGxldmVsIG1lc3NhZ2UgcHJvY2Vzc2luZyAqLwpleHRlcm4gaW50IGlibWFzbV9zZW5kX2kyb19tZXNzYWdlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gaXJxcmV0dXJuX3QgaWJtYXNtX2ludGVycnVwdF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKiBkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKCi8qIHJlbW90ZSBjb25zb2xlICovCmV4dGVybiB2b2lkIGlibWFzbV9oYW5kbGVfbW91c2VfaW50ZXJydXB0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gaW50IGlibWFzbV9pbml0X3JlbW90ZV9xdWV1ZShzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKnNwKTsKZXh0ZXJuIHZvaWQgaWJtYXNtX2ZyZWVfcmVtb3RlX3F1ZXVlKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gdm9pZCBpYm1hc21fYWR2YW5jZV9yZWFkZXIoc3RydWN0IHJlbW90ZV9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IG4pOwpleHRlcm4gc2l6ZV90IGlibWFzbV9ldmVudHNfYXZhaWxhYmxlKHN0cnVjdCByZW1vdGVfcXVldWUgKnEpOwoKLyogZmlsZSBzeXN0ZW0gKi8KZXh0ZXJuIGludCBpYm1hc21mc19yZWdpc3Rlcih2b2lkKTsKZXh0ZXJuIHZvaWQgaWJtYXNtZnNfdW5yZWdpc3Rlcih2b2lkKTsKZXh0ZXJuIHZvaWQgaWJtYXNtZnNfYWRkX3NwKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwoKLyogdWFydCAqLwojaWZkZWYgQ09ORklHX1NFUklBTF84MjUwCmV4dGVybiB2b2lkIGlibWFzbV9yZWdpc3Rlcl91YXJ0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwpleHRlcm4gdm9pZCBpYm1hc21fdW5yZWdpc3Rlcl91YXJ0KHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3ApOwojZWxzZQojZGVmaW5lIGlibWFzbV9yZWdpc3Rlcl91YXJ0KHNwKQlkbyB7IH0gd2hpbGUoMCkKI2RlZmluZSBpYm1hc21fdW5yZWdpc3Rlcl91YXJ0KHNwKQlkbyB7IH0gd2hpbGUoMCkKI2VuZGlmCg==