LyoKICAgIGdsNTIwc20uYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCiAgICAgICAgICAgICAgICBtb25pdG9yaW5nCiAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPgogICAgQ29weXJpZ2h0IChjKSAyMDA1ICAgICAgICBNYWFydGVuIERlcHJleiA8bWFhcnRlbmRlcHJlekB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCgoqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtc2Vuc29yLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtdmlkLmg+CgovKiBUeXBlIG9mIHRoZSBleHRyYSBzZW5zb3IgKi8Kc3RhdGljIHVuc2lnbmVkIHNob3J0IGV4dHJhX3NlbnNvcl90eXBlOwptb2R1bGVfcGFyYW0oZXh0cmFfc2Vuc29yX3R5cGUsIHVzaG9ydCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoZXh0cmFfc2Vuc29yX3R5cGUsICJUeXBlIG9mIGV4dHJhIHNlbnNvciAoMD1hdXRvZGV0ZWN0LCAxPXRlbXBlcmF0dXJlLCAyPXZvbHRhZ2UpIik7CgovKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwpzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCBJMkNfQ0xJRU5UX0VORCB9OwpzdGF0aWMgdW5zaWduZWQgaW50IG5vcm1hbF9pc2FbXSA9IHsgSTJDX0NMSUVOVF9JU0FfRU5EIH07CgovKiBJbnNtb2QgcGFyYW1ldGVycyAqLwpTRU5TT1JTX0lOU01PRF8xKGdsNTIwc20pOwoKLyogTWFueSBHTDUyMCBjb25zdGFudHMgc3BlY2lmaWVkIGJlbG93IApPbmUgb2YgdGhlIGlucHV0cyBjYW4gYmUgY29uZmlndXJlZCBhcyBlaXRoZXIgdGVtcCBvciB2b2x0YWdlLgpUaGF0J3Mgd2h5IF9URU1QMiBhbmQgX0lONCBhY2Nlc3MgdGhlIHNhbWUgcmVnaXN0ZXIgCiovCgovKiBUaGUgR0w1MjAgcmVnaXN0ZXJzICovCiNkZWZpbmUgR0w1MjBfUkVHX0NISVBfSUQJCTB4MDAKI2RlZmluZSBHTDUyMF9SRUdfUkVWSVNJT04JCTB4MDEKI2RlZmluZSBHTDUyMF9SRUdfQ09ORgkJCTB4MDMKI2RlZmluZSBHTDUyMF9SRUdfTUFTSwkJCTB4MTEKCiNkZWZpbmUgR0w1MjBfUkVHX1ZJRF9JTlBVVAkJMHgwMgoKI2RlZmluZSBHTDUyMF9SRUdfSU4wX0lOUFVUCQkweDE1CiNkZWZpbmUgR0w1MjBfUkVHX0lOMF9MSU1JVAkJMHgwYwojZGVmaW5lIEdMNTIwX1JFR19JTjBfTUlOCQlHTDUyMF9SRUdfSU4wX0xJTUlUCiNkZWZpbmUgR0w1MjBfUkVHX0lOMF9NQVgJCUdMNTIwX1JFR19JTjBfTElNSVQKCiNkZWZpbmUgR0w1MjBfUkVHX0lOMV9JTlBVVAkJMHgxNAojZGVmaW5lIEdMNTIwX1JFR19JTjFfTElNSVQJCTB4MDkKI2RlZmluZSBHTDUyMF9SRUdfSU4xX01JTgkJR0w1MjBfUkVHX0lOMV9MSU1JVAojZGVmaW5lIEdMNTIwX1JFR19JTjFfTUFYCQlHTDUyMF9SRUdfSU4xX0xJTUlUCgojZGVmaW5lIEdMNTIwX1JFR19JTjJfSU5QVVQJCTB4MTMKI2RlZmluZSBHTDUyMF9SRUdfSU4yX0xJTUlUCQkweDBhCiNkZWZpbmUgR0w1MjBfUkVHX0lOMl9NSU4JCUdMNTIwX1JFR19JTjJfTElNSVQKI2RlZmluZSBHTDUyMF9SRUdfSU4yX01BWAkJR0w1MjBfUkVHX0lOMl9MSU1JVAoKI2RlZmluZSBHTDUyMF9SRUdfSU4zX0lOUFVUCQkweDBkCiNkZWZpbmUgR0w1MjBfUkVHX0lOM19MSU1JVAkJMHgwYgojZGVmaW5lIEdMNTIwX1JFR19JTjNfTUlOCQlHTDUyMF9SRUdfSU4zX0xJTUlUCiNkZWZpbmUgR0w1MjBfUkVHX0lOM19NQVgJCUdMNTIwX1JFR19JTjNfTElNSVQKCiNkZWZpbmUgR0w1MjBfUkVHX0lONF9JTlBVVAkJMHgwZQojZGVmaW5lIEdMNTIwX1JFR19JTjRfTUFYCQkweDE3CiNkZWZpbmUgR0w1MjBfUkVHX0lONF9NSU4JCTB4MTgKCiNkZWZpbmUgR0w1MjBfUkVHX1RFTVAxX0lOUFVUCQkweDA0CiNkZWZpbmUgR0w1MjBfUkVHX1RFTVAxX01BWAkJMHgwNQojZGVmaW5lIEdMNTIwX1JFR19URU1QMV9NQVhfSFlTVAkweDA2CgojZGVmaW5lIEdMNTIwX1JFR19URU1QMl9JTlBVVAkJMHgwZQojZGVmaW5lIEdMNTIwX1JFR19URU1QMl9NQVgJCTB4MTcKI2RlZmluZSBHTDUyMF9SRUdfVEVNUDJfTUFYX0hZU1QJMHgxOAoKI2RlZmluZSBHTDUyMF9SRUdfRkFOX0lOUFVUCQkweDA3CiNkZWZpbmUgR0w1MjBfUkVHX0ZBTl9NSU4JCTB4MDgKI2RlZmluZSBHTDUyMF9SRUdfRkFOX0RJVgkJMHgwZgojZGVmaW5lIEdMNTIwX1JFR19GQU5fT0ZGCQlHTDUyMF9SRUdfRkFOX0RJVgoKI2RlZmluZSBHTDUyMF9SRUdfQUxBUk1TCQkweDEyCiNkZWZpbmUgR0w1MjBfUkVHX0JFRVBfTUFTSwkJMHgxMAojZGVmaW5lIEdMNTIwX1JFR19CRUVQX0VOQUJMRQkJR0w1MjBfUkVHX0NPTkYKCi8qCiAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucwogKi8KCnN0YXRpYyBpbnQgZ2w1MjBfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKc3RhdGljIGludCBnbDUyMF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpOwpzdGF0aWMgdm9pZCBnbDUyMF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKc3RhdGljIGludCBnbDUyMF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwpzdGF0aWMgaW50IGdsNTIwX3JlYWRfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnKTsKc3RhdGljIGludCBnbDUyMF93cml0ZV92YWx1ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHUxNiB2YWx1ZSk7CnN0YXRpYyBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZ2w1MjBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwoKLyogRHJpdmVyIGRhdGEgKi8Kc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGdsNTIwX2RyaXZlciA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5uYW1lCQk9ICJnbDUyMHNtIiwKCS5pZAkJPSBJMkNfRFJJVkVSSURfR0w1MjAsCgkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKCS5hdHRhY2hfYWRhcHRlcgk9IGdsNTIwX2F0dGFjaF9hZGFwdGVyLAoJLmRldGFjaF9jbGllbnQJPSBnbDUyMF9kZXRhY2hfY2xpZW50LAp9OwoKLyogQ2xpZW50IGRhdGEgKi8Kc3RydWN0IGdsNTIwX2RhdGEgewoJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OwoJc3RydWN0IHNlbWFwaG9yZSB1cGRhdGVfbG9jazsKCWNoYXIgdmFsaWQ7CQkvKiB6ZXJvIHVudGlsIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwoJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIGluIGppZmZpZXMgKi8KCgl1OCB2aWQ7Cgl1OCB2cm07Cgl1OCBpbl9pbnB1dFs1XTsJCS8qIFswXSA9IFZWRCAqLwoJdTggaW5fbWluWzVdOwkJLyogWzBdID0gVkREICovCgl1OCBpbl9tYXhbNV07CQkvKiBbMF0gPSBWREQgKi8KCXU4IGZhbl9pbnB1dFsyXTsKCXU4IGZhbl9taW5bMl07Cgl1OCBmYW5fZGl2WzJdOwoJdTggZmFuX29mZjsKCXU4IHRlbXBfaW5wdXRbMl07Cgl1OCB0ZW1wX21heFsyXTsKCXU4IHRlbXBfbWF4X2h5c3RbMl07Cgl1OCBhbGFybXM7Cgl1OCBiZWVwX2VuYWJsZTsKCXU4IGJlZXBfbWFzazsKCXU4IGFsYXJtX21hc2s7Cgl1OCB0d29fdGVtcHM7Cn07CgovKgogKiBTeXNmcyBzdHVmZgogKi8KCiNkZWZpbmUgc3lzZnNfcih0eXBlLCBuLCBpdGVtLCByZWcpIFwKc3RhdGljIHNzaXplX3QgZ2V0XyMjdHlwZSMjaXRlbSAoc3RydWN0IGdsNTIwX2RhdGEgKiwgY2hhciAqLCBpbnQpOyBcCnN0YXRpYyBzc2l6ZV90IGdldF8jI3R5cGUjI24jI2l0ZW0gKHN0cnVjdCBkZXZpY2UgKiwgY2hhciAqKTsgXApzdGF0aWMgc3NpemVfdCBnZXRfIyN0eXBlIyNuIyNpdGVtIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikgXAp7IFwKCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gZ2w1MjBfdXBkYXRlX2RldmljZShkZXYpOyBcCglyZXR1cm4gZ2V0XyMjdHlwZSMjaXRlbShkYXRhLCBidWYsIChuKSk7IFwKfQoKI2RlZmluZSBzeXNmc193KHR5cGUsIG4sIGl0ZW0sIHJlZykgXApzdGF0aWMgc3NpemVfdCBzZXRfIyN0eXBlIyNpdGVtIChzdHJ1Y3QgaTJjX2NsaWVudCAqLCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqLCBjb25zdCBjaGFyICosIHNpemVfdCwgaW50LCBpbnQpOyBcCnN0YXRpYyBzc2l6ZV90IHNldF8jI3R5cGUjI24jI2l0ZW0gKHN0cnVjdCBkZXZpY2UgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOyBcCnN0YXRpYyBzc2l6ZV90IHNldF8jI3R5cGUjI24jI2l0ZW0gKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKeyBcCglzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOyBcCglzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOyBcCglyZXR1cm4gc2V0XyMjdHlwZSMjaXRlbShjbGllbnQsIGRhdGEsIGJ1ZiwgY291bnQsIChuKSwgcmVnKTsgXAp9CgojZGVmaW5lIHN5c2ZzX3J3X24odHlwZSwgbiwgaXRlbSwgcmVnKSBcCnN5c2ZzX3IodHlwZSwgbiwgaXRlbSwgcmVnKSBcCnN5c2ZzX3codHlwZSwgbiwgaXRlbSwgcmVnKSBcCnN0YXRpYyBERVZJQ0VfQVRUUih0eXBlIyNuIyNpdGVtLCBTX0lSVUdPIHwgU19JV1VTUiwgZ2V0XyMjdHlwZSMjbiMjaXRlbSwgc2V0XyMjdHlwZSMjbiMjaXRlbSk7CgojZGVmaW5lIHN5c2ZzX3JvX24odHlwZSwgbiwgaXRlbSwgcmVnKSBcCnN5c2ZzX3IodHlwZSwgbiwgaXRlbSwgcmVnKSBcCnN0YXRpYyBERVZJQ0VfQVRUUih0eXBlIyNuIyNpdGVtLCBTX0lSVUdPLCBnZXRfIyN0eXBlIyNuIyNpdGVtLCBOVUxMKTsKCiNkZWZpbmUgc3lzZnNfcncodHlwZSwgaXRlbSwgcmVnKSBcCnN5c2ZzX3IodHlwZSwgMCwgaXRlbSwgcmVnKSBcCnN5c2ZzX3codHlwZSwgMCwgaXRlbSwgcmVnKSBcCnN0YXRpYyBERVZJQ0VfQVRUUih0eXBlIyNpdGVtLCBTX0lSVUdPIHwgU19JV1VTUiwgZ2V0XyMjdHlwZSMjMCMjaXRlbSwgc2V0XyMjdHlwZSMjMCMjaXRlbSk7CgojZGVmaW5lIHN5c2ZzX3JvKHR5cGUsIGl0ZW0sIHJlZykgXApzeXNmc19yKHR5cGUsIDAsIGl0ZW0sIHJlZykgXApzdGF0aWMgREVWSUNFX0FUVFIodHlwZSMjaXRlbSwgU19JUlVHTywgZ2V0XyMjdHlwZSMjMCMjaXRlbSwgTlVMTCk7CgoKI2RlZmluZSBzeXNmc192aWQobikgXApzeXNmc19yb19uKGNwdSwgbiwgX3ZpZCwgR0w1MjBfUkVHX1ZJRF9JTlBVVCkKCiNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3ZpZChjbGllbnQsIG4pIFwKZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2NwdSMjbiMjX3ZpZCkKCiNkZWZpbmUgc3lzZnNfaW4obikgXApzeXNmc19yb19uKGluLCBuLCBfaW5wdXQsIEdMNTIwX1JFR19JTiMjbiMjSU5QVVQpIFwKc3lzZnNfcndfbihpbiwgbiwgX21pbiwgR0w1MjBfUkVHX0lOIyNuIyNfTUlOKSBcCnN5c2ZzX3J3X24oaW4sIG4sIF9tYXgsIEdMNTIwX1JFR19JTiMjbiMjX01BWCkgXAoKI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfaW4oY2xpZW50LCBuKSBcCih7ZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2luIyNuIyNfaW5wdXQpOyBcCmRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbiMjbiMjX21pbik7IFwKZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2luIyNuIyNfbWF4KTt9KQoKI2RlZmluZSBzeXNmc19mYW4obikgXApzeXNmc19yb19uKGZhbiwgbiwgX2lucHV0LCBHTDUyMF9SRUdfRkFOX0lOUFVUKSBcCnN5c2ZzX3J3X24oZmFuLCBuLCBfbWluLCBHTDUyMF9SRUdfRkFOX01JTikgXApzeXNmc19yd19uKGZhbiwgbiwgX2RpdiwgR0w1MjBfUkVHX0ZBTl9ESVYpCgojZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9mYW4oY2xpZW50LCBuKSBcCih7ZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjbiMjX2lucHV0KTsgXApkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuIyNuIyNfbWluKTsgXApkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuIyNuIyNfZGl2KTt9KQoKI2RlZmluZSBzeXNmc19mYW5fb2ZmKG4pIFwKc3lzZnNfcndfbihmYW4sIG4sIF9vZmYsIEdMNTIwX1JFR19GQU5fT0ZGKSBcCgojZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV9mYW5fb2ZmKGNsaWVudCwgbikgXApkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfZmFuIyNuIyNfb2ZmKQoKI2RlZmluZSBzeXNmc190ZW1wKG4pIFwKc3lzZnNfcm9fbih0ZW1wLCBuLCBfaW5wdXQsIEdMNTIwX1JFR19URU1QIyNuIyNfSU5QVVQpIFwKc3lzZnNfcndfbih0ZW1wLCBuLCBfbWF4LCBHTDUyMF9SRUdfVEVNUCMjbiMjX01BWCkgXApzeXNmc19yd19uKHRlbXAsIG4sIF9tYXhfaHlzdCwgR0w1MjBfUkVHX1RFTVAjI24jI19NQVhfSFlTVCkKCiNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX3RlbXAoY2xpZW50LCBuKSBcCih7ZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAjI24jI19pbnB1dCk7IFwKZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX3RlbXAjI24jI19tYXgpOyBcCmRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNuIyNfbWF4X2h5c3QpO30pCgojZGVmaW5lIHN5c2ZzX2FsYXJtcygpIFwKc3lzZnNfcm8oYWxhcm1zLCAsIEdMNTIwX1JFR19BTEFSTVMpIFwKc3lzZnNfcncoYmVlcF9lbmFibGUsICwgR0w1MjBfUkVHX0JFRVBfRU5BQkxFKSBcCnN5c2ZzX3J3KGJlZXBfbWFzaywgLCBHTDUyMF9SRUdfQkVFUF9NQVNLKQoKI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfYWxhcm1zKGNsaWVudCkgXAooe2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9hbGFybXMpOyBcCmRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9iZWVwX2VuYWJsZSk7IFwKZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2JlZXBfbWFzayk7fSkKCgpzeXNmc192aWQoMCkKCnN5c2ZzX2luKDApCnN5c2ZzX2luKDEpCnN5c2ZzX2luKDIpCnN5c2ZzX2luKDMpCnN5c2ZzX2luKDQpCgpzeXNmc19mYW4oMSkKc3lzZnNfZmFuKDIpCnN5c2ZzX2Zhbl9vZmYoMSkKCnN5c2ZzX3RlbXAoMSkKc3lzZnNfdGVtcCgyKQoKc3lzZnNfYWxhcm1zKCkKCgpzdGF0aWMgc3NpemVfdCBnZXRfY3B1X3ZpZChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKewoJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZpZF9mcm9tX3JlZyhkYXRhLT52aWQsIGRhdGEtPnZybSkpOwp9CgojZGVmaW5lIFZERF9GUk9NX1JFRyh2YWwpICgoKHZhbCkqOTUrMikvNCkKI2RlZmluZSBWRERfVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKCgodmFsKSo0KzQ3KS85NSksMCwyNTUpKQoKI2RlZmluZSBJTl9GUk9NX1JFRyh2YWwpICgodmFsKSoxOSkKI2RlZmluZSBJTl9UT19SRUcodmFsKSAoU0VOU09SU19MSU1JVCgoKCh2YWwpKzkpLzE5KSwwLDI1NSkpCgpzdGF0aWMgc3NpemVfdCBnZXRfaW5faW5wdXQoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXU4IHIgPSBkYXRhLT5pbl9pbnB1dFtuXTsKCglpZiAobiA9PSAwKQoJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBWRERfRlJPTV9SRUcocikpOwoJZWxzZQoJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhyKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IGdldF9pbl9taW4oc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXU4IHIgPSBkYXRhLT5pbl9taW5bbl07CgoJaWYgKG4gPT0gMCkKCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVkREX0ZST01fUkVHKHIpKTsKCWVsc2UKCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcocikpOwp9CgpzdGF0aWMgc3NpemVfdCBnZXRfaW5fbWF4KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7Cgl1OCByID0gZGF0YS0+aW5fbWF4W25dOwoKCWlmIChuID09IDApCgkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFZERF9GUk9NX1JFRyhyKSk7CgllbHNlCgkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKHIpKTsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X2luX21pbihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQp7Cglsb25nIHYgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoJdTggcjsKCglkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CgoJaWYgKG4gPT0gMCkKCQlyID0gVkREX1RPX1JFRyh2KTsKCWVsc2UKCQlyID0gSU5fVE9fUkVHKHYpOwoKCWRhdGEtPmluX21pbltuXSA9IHI7CgoJaWYgKG4gPCA0KQoJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHhmZikgfCByKTsKCWVsc2UKCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgcik7CgoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X2luX21heChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQp7Cglsb25nIHYgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoJdTggcjsKCglpZiAobiA9PSAwKQoJCXIgPSBWRERfVE9fUkVHKHYpOwoJZWxzZQoJCXIgPSBJTl9UT19SRUcodik7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoKCWRhdGEtPmluX21heFtuXSA9IHI7CgoJaWYgKG4gPCA0KQoJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHhmZjAwKSB8IChyIDw8IDgpKTsKCWVsc2UKCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgcik7CgoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQoKI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKSAoMSA8PCAodmFsKSkKI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikgKCh2YWwpPT0wID8gMCA6ICg0ODAwMDAvKCh2YWwpIDw8IChkaXYpKSkpCiNkZWZpbmUgRkFOX1RPX1JFRyh2YWwsZGl2KSAoKHZhbCk8PTA/MDpTRU5TT1JTX0xJTUlUKCg0ODAwMDAgKyAoKHZhbCkgPDwgKChkaXYpLTEpKSkgLyAoKHZhbCkgPDwgKGRpdikpLCAxLCAyNTUpKTsKCnN0YXRpYyBzc2l6ZV90IGdldF9mYW5faW5wdXQoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX2lucHV0W24gLSAxXSwgZGF0YS0+ZmFuX2RpdltuIC0gMV0pKTsKfQoKc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl9taW4oc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltuIC0gMV0sIGRhdGEtPmZhbl9kaXZbbiAtIDFdKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IGdldF9mYW5fZGl2KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbiAtIDFdKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IGdldF9mYW5fb2ZmKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+ZmFuX29mZik7Cn0KCnN0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCnsKCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwoJdTggcjsKCglkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CglyID0gRkFOX1RPX1JFRyh2LCBkYXRhLT5mYW5fZGl2W24gLSAxXSk7CglkYXRhLT5mYW5fbWluW24gLSAxXSA9IHI7CgoJaWYgKG4gPT0gMSkKCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4ZmYwMCkgfCAociA8PCA4KSk7CgllbHNlCgkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgcmVnKSAmIH4weGZmKSB8IHIpOwoKCWRhdGEtPmJlZXBfbWFzayA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9NQVNLKTsKCWlmIChkYXRhLT5mYW5fbWluW24gLSAxXSA9PSAwKQoJCWRhdGEtPmFsYXJtX21hc2sgJj0gKG4gPT0gMSkgPyB+MHgyMCA6IH4weDQwOwoJZWxzZQoJCWRhdGEtPmFsYXJtX21hc2sgfD0gKG4gPT0gMSkgPyAweDIwIDogMHg0MDsKCWRhdGEtPmJlZXBfbWFzayAmPSBkYXRhLT5hbGFybV9tYXNrOwoJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9NQVNLLCBkYXRhLT5iZWVwX21hc2spOwoKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBzc2l6ZV90IHNldF9mYW5fZGl2KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCnsKCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwoJdTggcjsKCglzd2l0Y2ggKHYpIHsKCWNhc2UgMTogciA9IDA7IGJyZWFrOwoJY2FzZSAyOiByID0gMTsgYnJlYWs7CgljYXNlIDQ6IHIgPSAyOyBicmVhazsKCWNhc2UgODogciA9IDM7IGJyZWFrOwoJZGVmYXVsdDoKCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhbl9kaXYgdmFsdWUgJWxkIG5vdCBzdXBwb3J0ZWQuIENob29zZSBvbmUgb2YgMSwgMiwgNCBvciA4IVxuIiwgdik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+ZmFuX2RpdltuIC0gMV0gPSByOwoKCWlmIChuID09IDEpCgkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgcmVnKSAmIH4weGMwKSB8IChyIDw8IDYpKTsKCWVsc2UKCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4MzApIHwgKHIgPDwgNCkpOwoKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBzc2l6ZV90IHNldF9mYW5fb2ZmKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCnsKCXU4IHIgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKT8xOjA7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+ZmFuX29mZiA9IHI7CglnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4MGMpIHwgKHIgPDwgMikpOwoJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQoKI2RlZmluZSBURU1QX0ZST01fUkVHKHZhbCkgKCgodmFsKSAtIDEzMCkgKiAxMDAwKQojZGVmaW5lIFRFTVBfVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKCgoKHZhbCk8MD8odmFsKS01MDA6KHZhbCkrNTAwKSAvIDEwMDApKzEzMCksMCwyNTUpKQoKc3RhdGljIHNzaXplX3QgZ2V0X3RlbXBfaW5wdXQoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaW5wdXRbbiAtIDFdKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IGdldF90ZW1wX21heChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKewoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9tYXhbbiAtIDFdKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IGdldF90ZW1wX21heF9oeXN0KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21heF9oeXN0W24gLSAxXSkpOwp9CgpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9tYXgoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKewoJbG9uZyB2ID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKCglkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CglkYXRhLT50ZW1wX21heFtuIC0gMV0gPSBURU1QX1RPX1JFRyh2KTs7CglnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dGVtcF9tYXhbbiAtIDFdKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21heF9oeXN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCnsKCWxvbmcgdiA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+dGVtcF9tYXhfaHlzdFtuIC0gMV0gPSBURU1QX1RPX1JFRyh2KTsKCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCBkYXRhLT50ZW1wX21heF9oeXN0W24gLSAxXSk7Cgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3NpemVfdCBnZXRfYWxhcm1zKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+YWxhcm1zKTsKfQoKc3RhdGljIHNzaXplX3QgZ2V0X2JlZXBfZW5hYmxlKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+YmVlcF9lbmFibGUpOwp9CgpzdGF0aWMgc3NpemVfdCBnZXRfYmVlcF9tYXNrKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+YmVlcF9tYXNrKTsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X2JlZXBfZW5hYmxlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCnsKCXU4IHIgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKT8wOjE7CgoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJZGF0YS0+YmVlcF9lbmFibGUgPSAhcjsKCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHgwNCkgfCAociA8PCAyKSk7Cgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3NpemVfdCBzZXRfYmVlcF9tYXNrKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCnsKCXU4IHIgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKCQoJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOwoJciAmPSBkYXRhLT5hbGFybV9tYXNrOwoJZGF0YS0+YmVlcF9tYXNrID0gcjsKCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCByKTsKCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KCgovKgogKiBSZWFsIGNvZGUKICovCgpzdGF0aWMgaW50IGdsNTIwX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKewoJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQoJCXJldHVybiAwOwoJcmV0dXJuIGkyY19kZXRlY3QoYWRhcHRlciwgJmFkZHJfZGF0YSwgZ2w1MjBfZGV0ZWN0KTsKfQoKc3RhdGljIGludCBnbDUyMF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCnsKCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OwoJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGE7CglpbnQgZXJyID0gMDsKCglpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CgkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpCgkJZ290byBleGl0OwoKCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCgkgICBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGdsNTIwX3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KCglpZiAoIShkYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGdsNTIwX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdDsKCX0KCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGdsNTIwX2RhdGEpKTsKCgluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOwoJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CgluZXdfY2xpZW50LT5kcml2ZXIgPSAmZ2w1MjBfZHJpdmVyOwoJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOwoKCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLwoJaWYgKGtpbmQgPCAwKSB7CgkJaWYgKChnbDUyMF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEdMNTIwX1JFR19DSElQX0lEKSAhPSAweDIwKSB8fAoJCSAgICAoKGdsNTIwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgR0w1MjBfUkVHX1JFVklTSU9OKSAmIDB4N2YpICE9IDB4MDApIHx8CgkJICAgICgoZ2w1MjBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBHTDUyMF9SRUdfQ09ORikgJiAweDgwKSAhPSAweDAwKSkgewoJCQlkZXZfZGJnKCZuZXdfY2xpZW50LT5kZXYsICJVbmtub3duIGNoaXAgdHlwZSwgc2tpcHBpbmdcbiIpOwoJCQlnb3RvIGV4aXRfZnJlZTsKCQl9Cgl9CgoJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgImdsNTIwc20iLCBJMkNfTkFNRV9TSVpFKTsKCWRhdGEtPnZhbGlkID0gMDsKCWluaXRfTVVURVgoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCgkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCglpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKCQlnb3RvIGV4aXRfZnJlZTsKCgkvKiBJbml0aWFsaXplIHRoZSBHTDUyMFNNIGNoaXAgKi8KCWdsNTIwX2luaXRfY2xpZW50KG5ld19jbGllbnQpOwoKCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCglkZXZpY2VfY3JlYXRlX2ZpbGVfdmlkKG5ld19jbGllbnQsIDApOwoKCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAwKTsKCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAxKTsKCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAyKTsKCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAzKTsKCWlmICghZGF0YS0+dHdvX3RlbXBzKQoJCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA0KTsKCglkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDEpOwoJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAyKTsKCWRldmljZV9jcmVhdGVfZmlsZV9mYW5fb2ZmKG5ld19jbGllbnQsIDEpOwoKCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDEpOwoJaWYgKGRhdGEtPnR3b190ZW1wcykKCQlkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChuZXdfY2xpZW50LCAyKTsKCglkZXZpY2VfY3JlYXRlX2ZpbGVfYWxhcm1zKG5ld19jbGllbnQpOwoKCXJldHVybiAwOwoKZXhpdF9mcmVlOgoJa2ZyZWUoZGF0YSk7CmV4aXQ6CglyZXR1cm4gZXJyOwp9CgoKLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBHTDUyMFNNLiAqLwpzdGF0aWMgdm9pZCBnbDUyMF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7CglzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJdTggb2xkY29uZiwgY29uZjsKCgljb25mID0gb2xkY29uZiA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQ09ORik7CgoJZGF0YS0+YWxhcm1fbWFzayA9IDB4ZmY7CglkYXRhLT52cm0gPSBpMmNfd2hpY2hfdnJtKCk7CgoJaWYgKGV4dHJhX3NlbnNvcl90eXBlID09IDEpCgkJY29uZiAmPSB+MHgxMDsKCWVsc2UgaWYgKGV4dHJhX3NlbnNvcl90eXBlID09IDIpCgkJY29uZiB8PSAweDEwOwoJZGF0YS0+dHdvX3RlbXBzID0gIShjb25mICYgMHgxMCk7CgoJLyogSWYgSVJRIyBpcyBkaXNhYmxlZCwgd2UgY2FuIHNhZmVseSBmb3JjZSBjb21wYXJhdG9yIG1vZGUgKi8KCWlmICghKGNvbmYgJiAweDIwKSkKCQljb25mICY9IDB4Zjc7CgoJLyogRW5hYmxlIG1vbml0b3JpbmcgaWYgbmVlZGVkICovCgljb25mIHw9IDB4NDA7CgoJaWYgKGNvbmYgIT0gb2xkY29uZikKCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19DT05GLCBjb25mKTsKCglnbDUyMF91cGRhdGVfZGV2aWNlKCYoY2xpZW50LT5kZXYpKTsKCglpZiAoZGF0YS0+ZmFuX21pblswXSA9PSAwKQoJCWRhdGEtPmFsYXJtX21hc2sgJj0gfjB4MjA7CglpZiAoZGF0YS0+ZmFuX21pblsxXSA9PSAwKQoJCWRhdGEtPmFsYXJtX21hc2sgJj0gfjB4NDA7CgoJZGF0YS0+YmVlcF9tYXNrICY9IGRhdGEtPmFsYXJtX21hc2s7CglnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19CRUVQX01BU0ssIGRhdGEtPmJlZXBfbWFzayk7Cn0KCnN0YXRpYyBpbnQgZ2w1MjBfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7CglpbnQgZXJyOwoKCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpIHsKCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNsaWVudCBkZXJlZ2lzdHJhdGlvbiBmYWlsZWQsICIKCQkJImNsaWVudCBub3QgZGV0YWNoZWQuXG4iKTsKCQlyZXR1cm4gZXJyOwoJfQoKCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKCXJldHVybiAwOwp9CgoKLyogUmVnaXN0ZXJzIDB4MDcgdG8gMHgwYyBhcmUgd29yZC1zaXplZCwgb3RoZXJzIGFyZSBieXRlLXNpemVkIAogICBHTDUyMCB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24gKi8Kc3RhdGljIGludCBnbDUyMF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKewoJaWYgKChyZWcgPj0gMHgwNykgJiYgKHJlZyA8PSAweDBjKSkKCQlyZXR1cm4gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZykpOwoJZWxzZQoJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwp9CgpzdGF0aWMgaW50IGdsNTIwX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKQp7CglpZiAoKHJlZyA+PSAweDA3KSAmJiAocmVnIDw9IDB4MGMpKQoJCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKCWVsc2UKCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOwp9CgoKc3RhdGljIHN0cnVjdCBnbDUyMF9kYXRhICpnbDUyMF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CglpbnQgdmFsOwoKCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCglpZiAoKGppZmZpZXMgLSBkYXRhLT5sYXN0X3VwZGF0ZWQgPiAyICogSFopIHx8CgkgICAgKGppZmZpZXMgPCBkYXRhLT5sYXN0X3VwZGF0ZWQpIHx8ICFkYXRhLT52YWxpZCkgewoKCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGdsNTIwc20gdXBkYXRlXG4iKTsKCgkJZGF0YS0+YWxhcm1zID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19BTEFSTVMpOwoJCWRhdGEtPmJlZXBfbWFzayA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9NQVNLKTsKCQlkYXRhLT52aWQgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1ZJRF9JTlBVVCkgJiAweDFmOwoKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOMF9MSU1JVCk7CgkJZGF0YS0+aW5fbWluWzBdID0gdmFsICYgMHhmZjsKCQlkYXRhLT5pbl9tYXhbMF0gPSAodmFsID4+IDgpICYgMHhmZjsKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOMV9MSU1JVCk7CgkJZGF0YS0+aW5fbWluWzFdID0gdmFsICYgMHhmZjsKCQlkYXRhLT5pbl9tYXhbMV0gPSAodmFsID4+IDgpICYgMHhmZjsKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOMl9MSU1JVCk7CgkJZGF0YS0+aW5fbWluWzJdID0gdmFsICYgMHhmZjsKCQlkYXRhLT5pbl9tYXhbMl0gPSAodmFsID4+IDgpICYgMHhmZjsKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOM19MSU1JVCk7CgkJZGF0YS0+aW5fbWluWzNdID0gdmFsICYgMHhmZjsKCQlkYXRhLT5pbl9tYXhbM10gPSAodmFsID4+IDgpICYgMHhmZjsKCgkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19GQU5fSU5QVVQpOwoJCWRhdGEtPmZhbl9pbnB1dFswXSA9ICh2YWwgPj4gOCkgJiAweGZmOwoJCWRhdGEtPmZhbl9pbnB1dFsxXSA9IHZhbCAmIDB4ZmY7CgoJCXZhbCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfRkFOX01JTik7CgkJZGF0YS0+ZmFuX21pblswXSA9ICh2YWwgPj4gOCkgJiAweGZmOwoJCWRhdGEtPmZhbl9taW5bMV0gPSB2YWwgJiAweGZmOwoKCQlkYXRhLT50ZW1wX2lucHV0WzBdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMV9JTlBVVCk7CgkJZGF0YS0+dGVtcF9tYXhbMF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1RFTVAxX01BWCk7CgkJZGF0YS0+dGVtcF9tYXhfaHlzdFswXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfVEVNUDFfTUFYX0hZU1QpOwoKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0ZBTl9ESVYpOwoJCWRhdGEtPmZhbl9kaXZbMF0gPSAodmFsID4+IDYpICYgMHgwMzsKCQlkYXRhLT5mYW5fZGl2WzFdID0gKHZhbCA+PiA0KSAmIDB4MDM7CgkJZGF0YS0+ZmFuX29mZiA9ICh2YWwgPj4gMikgJiAweDAxOwoKCQlkYXRhLT5hbGFybXMgJj0gZGF0YS0+YWxhcm1fbWFzazsKCgkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19DT05GKTsKCQlkYXRhLT5iZWVwX2VuYWJsZSA9ICEoKHZhbCA+PiAyKSAmIDEpOwoKCQlkYXRhLT5pbl9pbnB1dFswXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4wX0lOUFVUKTsKCQlkYXRhLT5pbl9pbnB1dFsxXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4xX0lOUFVUKTsKCQlkYXRhLT5pbl9pbnB1dFsyXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4yX0lOUFVUKTsKCQlkYXRhLT5pbl9pbnB1dFszXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4zX0lOUFVUKTsKCgkJLyogVGVtcDEgYW5kIFZpbjQgYXJlIHRoZSBzYW1lIGlucHV0ICovCgkJaWYgKGRhdGEtPnR3b190ZW1wcykgewoJCQlkYXRhLT50ZW1wX2lucHV0WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMl9JTlBVVCk7CgkJCWRhdGEtPnRlbXBfbWF4WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMl9NQVgpOwoJCQlkYXRhLT50ZW1wX21heF9oeXN0WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMl9NQVhfSFlTVCk7CgkJfSBlbHNlIHsKCQkJZGF0YS0+aW5faW5wdXRbNF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lONF9JTlBVVCk7CgkJCWRhdGEtPmluX21pbls0XSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU40X01JTik7CgkJCWRhdGEtPmluX21heFs0XSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU40X01BWCk7CgkJfQoKCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOwoJCWRhdGEtPnZhbGlkID0gMTsKCX0KCgl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOwoKCXJldHVybiBkYXRhOwp9CgoKc3RhdGljIGludCBfX2luaXQgc2Vuc29yc19nbDUyMHNtX2luaXQodm9pZCkKewoJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZnbDUyMF9kcml2ZXIpOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19nbDUyMHNtX2V4aXQodm9pZCkKewoJaTJjX2RlbF9kcml2ZXIoJmdsNTIwX2RyaXZlcik7Cn0KCgpNT0RVTEVfQVVUSE9SKCJGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LCAiCgkiS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+LCAiCgkiTWFhcnRlbiBEZXByZXogPG1hYXJ0ZW5kZXByZXpAdXNlcnMuc291cmNlZm9yZ2UubmV0PiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkdMNTIwU00gZHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9pbml0KHNlbnNvcnNfZ2w1MjBzbV9pbml0KTsKbW9kdWxlX2V4aXQoc2Vuc29yc19nbDUyMHNtX2V4aXQpOwo=