LyoKICAgIGdsNTIwc20uYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgTGludXgga2VybmVsIG1vZHVsZXMgZm9yIGhhcmR3YXJlCiAgICAgICAgICAgICAgICBtb25pdG9yaW5nCiAgICBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPgogICAgQ29weXJpZ2h0IChjKSAyMDA1ICAgICAgICBNYWFydGVuIERlcHJleiA8bWFhcnRlbmRlcHJlekB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CgogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCgoqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9od21vbi5oPgojaW5jbHVkZSA8bGludXgvaHdtb24tdmlkLmg+CiNpbmNsdWRlIDxsaW51eC9lcnIuaD4KI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CgovKiBUeXBlIG9mIHRoZSBleHRyYSBzZW5zb3IgKi8Kc3RhdGljIHVuc2lnbmVkIHNob3J0IGV4dHJhX3NlbnNvcl90eXBlOwptb2R1bGVfcGFyYW0oZXh0cmFfc2Vuc29yX3R5cGUsIHVzaG9ydCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoZXh0cmFfc2Vuc29yX3R5cGUsICJUeXBlIG9mIGV4dHJhIHNlbnNvciAoMD1hdXRvZGV0ZWN0LCAxPXRlbXBlcmF0dXJlLCAyPXZvbHRhZ2UpIik7CgovKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwpzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCBJMkNfQ0xJRU5UX0VORCB9OwoKLyogSW5zbW9kIHBhcmFtZXRlcnMgKi8KSTJDX0NMSUVOVF9JTlNNT0RfMShnbDUyMHNtKTsKCi8qIE1hbnkgR0w1MjAgY29uc3RhbnRzIHNwZWNpZmllZCBiZWxvdyAKT25lIG9mIHRoZSBpbnB1dHMgY2FuIGJlIGNvbmZpZ3VyZWQgYXMgZWl0aGVyIHRlbXAgb3Igdm9sdGFnZS4KVGhhdCdzIHdoeSBfVEVNUDIgYW5kIF9JTjQgYWNjZXNzIHRoZSBzYW1lIHJlZ2lzdGVyIAoqLwoKLyogVGhlIEdMNTIwIHJlZ2lzdGVycyAqLwojZGVmaW5lIEdMNTIwX1JFR19DSElQX0lECQkweDAwCiNkZWZpbmUgR0w1MjBfUkVHX1JFVklTSU9OCQkweDAxCiNkZWZpbmUgR0w1MjBfUkVHX0NPTkYJCQkweDAzCiNkZWZpbmUgR0w1MjBfUkVHX01BU0sJCQkweDExCgojZGVmaW5lIEdMNTIwX1JFR19WSURfSU5QVVQJCTB4MDIKCiNkZWZpbmUgR0w1MjBfUkVHX0lOMF9JTlBVVAkJMHgxNQojZGVmaW5lIEdMNTIwX1JFR19JTjBfTElNSVQJCTB4MGMKI2RlZmluZSBHTDUyMF9SRUdfSU4wX01JTgkJR0w1MjBfUkVHX0lOMF9MSU1JVAojZGVmaW5lIEdMNTIwX1JFR19JTjBfTUFYCQlHTDUyMF9SRUdfSU4wX0xJTUlUCgojZGVmaW5lIEdMNTIwX1JFR19JTjFfSU5QVVQJCTB4MTQKI2RlZmluZSBHTDUyMF9SRUdfSU4xX0xJTUlUCQkweDA5CiNkZWZpbmUgR0w1MjBfUkVHX0lOMV9NSU4JCUdMNTIwX1JFR19JTjFfTElNSVQKI2RlZmluZSBHTDUyMF9SRUdfSU4xX01BWAkJR0w1MjBfUkVHX0lOMV9MSU1JVAoKI2RlZmluZSBHTDUyMF9SRUdfSU4yX0lOUFVUCQkweDEzCiNkZWZpbmUgR0w1MjBfUkVHX0lOMl9MSU1JVAkJMHgwYQojZGVmaW5lIEdMNTIwX1JFR19JTjJfTUlOCQlHTDUyMF9SRUdfSU4yX0xJTUlUCiNkZWZpbmUgR0w1MjBfUkVHX0lOMl9NQVgJCUdMNTIwX1JFR19JTjJfTElNSVQKCiNkZWZpbmUgR0w1MjBfUkVHX0lOM19JTlBVVAkJMHgwZAojZGVmaW5lIEdMNTIwX1JFR19JTjNfTElNSVQJCTB4MGIKI2RlZmluZSBHTDUyMF9SRUdfSU4zX01JTgkJR0w1MjBfUkVHX0lOM19MSU1JVAojZGVmaW5lIEdMNTIwX1JFR19JTjNfTUFYCQlHTDUyMF9SRUdfSU4zX0xJTUlUCgojZGVmaW5lIEdMNTIwX1JFR19JTjRfSU5QVVQJCTB4MGUKI2RlZmluZSBHTDUyMF9SRUdfSU40X01BWAkJMHgxNwojZGVmaW5lIEdMNTIwX1JFR19JTjRfTUlOCQkweDE4CgojZGVmaW5lIEdMNTIwX1JFR19URU1QMV9JTlBVVAkJMHgwNAojZGVmaW5lIEdMNTIwX1JFR19URU1QMV9NQVgJCTB4MDUKI2RlZmluZSBHTDUyMF9SRUdfVEVNUDFfTUFYX0hZU1QJMHgwNgoKI2RlZmluZSBHTDUyMF9SRUdfVEVNUDJfSU5QVVQJCTB4MGUKI2RlZmluZSBHTDUyMF9SRUdfVEVNUDJfTUFYCQkweDE3CiNkZWZpbmUgR0w1MjBfUkVHX1RFTVAyX01BWF9IWVNUCTB4MTgKCiNkZWZpbmUgR0w1MjBfUkVHX0ZBTl9JTlBVVAkJMHgwNwojZGVmaW5lIEdMNTIwX1JFR19GQU5fTUlOCQkweDA4CiNkZWZpbmUgR0w1MjBfUkVHX0ZBTl9ESVYJCTB4MGYKI2RlZmluZSBHTDUyMF9SRUdfRkFOX09GRgkJR0w1MjBfUkVHX0ZBTl9ESVYKCiNkZWZpbmUgR0w1MjBfUkVHX0FMQVJNUwkJMHgxMgojZGVmaW5lIEdMNTIwX1JFR19CRUVQX01BU0sJCTB4MTAKI2RlZmluZSBHTDUyMF9SRUdfQkVFUF9FTkFCTEUJCUdMNTIwX1JFR19DT05GCgovKgogKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMKICovCgpzdGF0aWMgaW50IGdsNTIwX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CnN0YXRpYyBpbnQgZ2w1MjBfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKc3RhdGljIHZvaWQgZ2w1MjBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CnN0YXRpYyBpbnQgZ2w1MjBfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKc3RhdGljIGludCBnbDUyMF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZyk7CnN0YXRpYyBpbnQgZ2w1MjBfd3JpdGVfdmFsdWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1MTYgdmFsdWUpOwpzdGF0aWMgc3RydWN0IGdsNTIwX2RhdGEgKmdsNTIwX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKCi8qIERyaXZlciBkYXRhICovCnN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBnbDUyMF9kcml2ZXIgPSB7CgkuZHJpdmVyID0gewoJCS5uYW1lCT0gImdsNTIwc20iLAoJfSwKCS5pZAkJPSBJMkNfRFJJVkVSSURfR0w1MjAsCgkuYXR0YWNoX2FkYXB0ZXIJPSBnbDUyMF9hdHRhY2hfYWRhcHRlciwKCS5kZXRhY2hfY2xpZW50CT0gZ2w1MjBfZGV0YWNoX2NsaWVudCwKfTsKCi8qIENsaWVudCBkYXRhICovCnN0cnVjdCBnbDUyMF9kYXRhIHsKCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKCWNoYXIgdmFsaWQ7CQkvKiB6ZXJvIHVudGlsIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLwoJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIGluIGppZmZpZXMgKi8KCgl1OCB2aWQ7Cgl1OCB2cm07Cgl1OCBpbl9pbnB1dFs1XTsJCS8qIFswXSA9IFZWRCAqLwoJdTggaW5fbWluWzVdOwkJLyogWzBdID0gVkREICovCgl1OCBpbl9tYXhbNV07CQkvKiBbMF0gPSBWREQgKi8KCXU4IGZhbl9pbnB1dFsyXTsKCXU4IGZhbl9taW5bMl07Cgl1OCBmYW5fZGl2WzJdOwoJdTggZmFuX29mZjsKCXU4IHRlbXBfaW5wdXRbMl07Cgl1OCB0ZW1wX21heFsyXTsKCXU4IHRlbXBfbWF4X2h5c3RbMl07Cgl1OCBhbGFybXM7Cgl1OCBiZWVwX2VuYWJsZTsKCXU4IGJlZXBfbWFzazsKCXU4IGFsYXJtX21hc2s7Cgl1OCB0d29fdGVtcHM7Cn07CgovKgogKiBTeXNmcyBzdHVmZgogKi8KCiNkZWZpbmUgc3lzZnNfcih0eXBlLCBuLCBpdGVtLCByZWcpIFwKc3RhdGljIHNzaXplX3QgZ2V0XyMjdHlwZSMjaXRlbSAoc3RydWN0IGdsNTIwX2RhdGEgKiwgY2hhciAqLCBpbnQpOyBcCnN0YXRpYyBzc2l6ZV90IGdldF8jI3R5cGUjI24jI2l0ZW0gKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKik7IFwKc3RhdGljIHNzaXplX3QgZ2V0XyMjdHlwZSMjbiMjaXRlbSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSBcCnsgXAoJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBnbDUyMF91cGRhdGVfZGV2aWNlKGRldik7IFwKCXJldHVybiBnZXRfIyN0eXBlIyNpdGVtKGRhdGEsIGJ1ZiwgKG4pKTsgXAp9CgojZGVmaW5lIHN5c2ZzX3codHlwZSwgbiwgaXRlbSwgcmVnKSBcCnN0YXRpYyBzc2l6ZV90IHNldF8jI3R5cGUjI2l0ZW0gKHN0cnVjdCBpMmNfY2xpZW50ICosIHN0cnVjdCBnbDUyMF9kYXRhICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBpbnQsIGludCk7IFwKc3RhdGljIHNzaXplX3Qgc2V0XyMjdHlwZSMjbiMjaXRlbSAoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqLCBzaXplX3QpOyBcCnN0YXRpYyBzc2l6ZV90IHNldF8jI3R5cGUjI24jI2l0ZW0gKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KSBcCnsgXAoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsgXAoJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAoJcmV0dXJuIHNldF8jI3R5cGUjI2l0ZW0oY2xpZW50LCBkYXRhLCBidWYsIGNvdW50LCAobiksIHJlZyk7IFwKfQoKI2RlZmluZSBzeXNmc19yd19uKHR5cGUsIG4sIGl0ZW0sIHJlZykgXApzeXNmc19yKHR5cGUsIG4sIGl0ZW0sIHJlZykgXApzeXNmc193KHR5cGUsIG4sIGl0ZW0sIHJlZykgXApzdGF0aWMgREVWSUNFX0FUVFIodHlwZSMjbiMjaXRlbSwgU19JUlVHTyB8IFNfSVdVU1IsIGdldF8jI3R5cGUjI24jI2l0ZW0sIHNldF8jI3R5cGUjI24jI2l0ZW0pOwoKI2RlZmluZSBzeXNmc19yb19uKHR5cGUsIG4sIGl0ZW0sIHJlZykgXApzeXNmc19yKHR5cGUsIG4sIGl0ZW0sIHJlZykgXApzdGF0aWMgREVWSUNFX0FUVFIodHlwZSMjbiMjaXRlbSwgU19JUlVHTywgZ2V0XyMjdHlwZSMjbiMjaXRlbSwgTlVMTCk7CgojZGVmaW5lIHN5c2ZzX3J3KHR5cGUsIGl0ZW0sIHJlZykgXApzeXNmc19yKHR5cGUsIDAsIGl0ZW0sIHJlZykgXApzeXNmc193KHR5cGUsIDAsIGl0ZW0sIHJlZykgXApzdGF0aWMgREVWSUNFX0FUVFIodHlwZSMjaXRlbSwgU19JUlVHTyB8IFNfSVdVU1IsIGdldF8jI3R5cGUjIzAjI2l0ZW0sIHNldF8jI3R5cGUjIzAjI2l0ZW0pOwoKI2RlZmluZSBzeXNmc19ybyh0eXBlLCBpdGVtLCByZWcpIFwKc3lzZnNfcih0eXBlLCAwLCBpdGVtLCByZWcpIFwKc3RhdGljIERFVklDRV9BVFRSKHR5cGUjI2l0ZW0sIFNfSVJVR08sIGdldF8jI3R5cGUjIzAjI2l0ZW0sIE5VTEwpOwoKCiNkZWZpbmUgc3lzZnNfdmlkKG4pIFwKc3lzZnNfcm9fbihjcHUsIG4sIF92aWQsIEdMNTIwX1JFR19WSURfSU5QVVQpCgojZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV92aWQoY2xpZW50LCBuKSBcCmRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9jcHUjI24jI192aWQpCgojZGVmaW5lIHN5c2ZzX2luKG4pIFwKc3lzZnNfcm9fbihpbiwgbiwgX2lucHV0LCBHTDUyMF9SRUdfSU4jI24jI0lOUFVUKSBcCnN5c2ZzX3J3X24oaW4sIG4sIF9taW4sIEdMNTIwX1JFR19JTiMjbiMjX01JTikgXApzeXNmc19yd19uKGluLCBuLCBfbWF4LCBHTDUyMF9SRUdfSU4jI24jI19NQVgpIFwKCiNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2luKGNsaWVudCwgbikgXAooe2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbiMjbiMjX2lucHV0KTsgXApkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4jI24jI19taW4pOyBcCmRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9pbiMjbiMjX21heCk7fSkKCiNkZWZpbmUgc3lzZnNfZmFuKG4pIFwKc3lzZnNfcm9fbihmYW4sIG4sIF9pbnB1dCwgR0w1MjBfUkVHX0ZBTl9JTlBVVCkgXApzeXNmc19yd19uKGZhbiwgbiwgX21pbiwgR0w1MjBfUkVHX0ZBTl9NSU4pIFwKc3lzZnNfcndfbihmYW4sIG4sIF9kaXYsIEdMNTIwX1JFR19GQU5fRElWKQoKI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKGNsaWVudCwgbikgXAooe2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9mYW4jI24jI19pbnB1dCk7IFwKZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjbiMjX21pbik7IFwKZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjbiMjX2Rpdik7fSkKCiNkZWZpbmUgc3lzZnNfZmFuX29mZihuKSBcCnN5c2ZzX3J3X24oZmFuLCBuLCBfb2ZmLCBHTDUyMF9SRUdfRkFOX09GRikgXAoKI2RlZmluZSBkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuX29mZihjbGllbnQsIG4pIFwKZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2ZhbiMjbiMjX29mZikKCiNkZWZpbmUgc3lzZnNfdGVtcChuKSBcCnN5c2ZzX3JvX24odGVtcCwgbiwgX2lucHV0LCBHTDUyMF9SRUdfVEVNUCMjbiMjX0lOUFVUKSBcCnN5c2ZzX3J3X24odGVtcCwgbiwgX21heCwgR0w1MjBfUkVHX1RFTVAjI24jI19NQVgpIFwKc3lzZnNfcndfbih0ZW1wLCBuLCBfbWF4X2h5c3QsIEdMNTIwX1JFR19URU1QIyNuIyNfTUFYX0hZU1QpCgojZGVmaW5lIGRldmljZV9jcmVhdGVfZmlsZV90ZW1wKGNsaWVudCwgbikgXAooe2RldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNuIyNfaW5wdXQpOyBcCmRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl90ZW1wIyNuIyNfbWF4KTsgXApkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdGVtcCMjbiMjX21heF9oeXN0KTt9KQoKI2RlZmluZSBzeXNmc19hbGFybXMoKSBcCnN5c2ZzX3JvKGFsYXJtcywgLCBHTDUyMF9SRUdfQUxBUk1TKSBcCnN5c2ZzX3J3KGJlZXBfZW5hYmxlLCAsIEdMNTIwX1JFR19CRUVQX0VOQUJMRSkgXApzeXNmc19ydyhiZWVwX21hc2ssICwgR0w1MjBfUkVHX0JFRVBfTUFTSykKCiNkZWZpbmUgZGV2aWNlX2NyZWF0ZV9maWxlX2FsYXJtcyhjbGllbnQpIFwKKHtkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsgXApkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYmVlcF9lbmFibGUpOyBcCmRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZkZXZfYXR0cl9iZWVwX21hc2spO30pCgoKc3lzZnNfdmlkKDApCgpzeXNmc19pbigwKQpzeXNmc19pbigxKQpzeXNmc19pbigyKQpzeXNmc19pbigzKQpzeXNmc19pbig0KQoKc3lzZnNfZmFuKDEpCnN5c2ZzX2ZhbigyKQpzeXNmc19mYW5fb2ZmKDEpCgpzeXNmc190ZW1wKDEpCnN5c2ZzX3RlbXAoMikKCnN5c2ZzX2FsYXJtcygpCgoKc3RhdGljIHNzaXplX3QgZ2V0X2NwdV92aWQoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkLCBkYXRhLT52cm0pKTsKfQoKI2RlZmluZSBWRERfRlJPTV9SRUcodmFsKSAoKCh2YWwpKjk1KzIpLzQpCiNkZWZpbmUgVkREX1RPX1JFRyh2YWwpIChTRU5TT1JTX0xJTUlUKCgoKHZhbCkqNCs0NykvOTUpLDAsMjU1KSkKCiNkZWZpbmUgSU5fRlJPTV9SRUcodmFsKSAoKHZhbCkqMTkpCiNkZWZpbmUgSU5fVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKCgodmFsKSs5KS8xOSksMCwyNTUpKQoKc3RhdGljIHNzaXplX3QgZ2V0X2luX2lucHV0KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7Cgl1OCByID0gZGF0YS0+aW5faW5wdXRbbl07CgoJaWYgKG4gPT0gMCkKCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVkREX0ZST01fUkVHKHIpKTsKCWVsc2UKCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgSU5fRlJPTV9SRUcocikpOwp9CgpzdGF0aWMgc3NpemVfdCBnZXRfaW5fbWluKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7Cgl1OCByID0gZGF0YS0+aW5fbWluW25dOwoKCWlmIChuID09IDApCgkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFZERF9GUk9NX1JFRyhyKSk7CgllbHNlCgkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKHIpKTsKfQoKc3RhdGljIHNzaXplX3QgZ2V0X2luX21heChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKewoJdTggciA9IGRhdGEtPmluX21heFtuXTsKCglpZiAobiA9PSAwKQoJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBWRERfRlJPTV9SRUcocikpOwoJZWxzZQoJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhyKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IHNldF9pbl9taW4oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKewoJbG9uZyB2ID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKCXU4IHI7CgoJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoKCWlmIChuID09IDApCgkJciA9IFZERF9UT19SRUcodik7CgllbHNlCgkJciA9IElOX1RPX1JFRyh2KTsKCglkYXRhLT5pbl9taW5bbl0gPSByOwoKCWlmIChuIDwgNCkKCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4ZmYpIHwgcik7CgllbHNlCgkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIHIpOwoKCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCnsKCWxvbmcgdiA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7Cgl1OCByOwoKCWlmIChuID09IDApCgkJciA9IFZERF9UT19SRUcodik7CgllbHNlCgkJciA9IElOX1RPX1JFRyh2KTsKCgltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CgoJZGF0YS0+aW5fbWF4W25dID0gcjsKCglpZiAobiA8IDQpCgkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgcmVnKSAmIH4weGZmMDApIHwgKHIgPDwgOCkpOwoJZWxzZQoJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCByKTsKCgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQoKI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKSAoMSA8PCAodmFsKSkKI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikgKCh2YWwpPT0wID8gMCA6ICg0ODAwMDAvKCh2YWwpIDw8IChkaXYpKSkpCiNkZWZpbmUgRkFOX1RPX1JFRyh2YWwsZGl2KSAoKHZhbCk8PTA/MDpTRU5TT1JTX0xJTUlUKCg0ODAwMDAgKyAoKHZhbCkgPDwgKChkaXYpLTEpKSkgLyAoKHZhbCkgPDwgKGRpdikpLCAxLCAyNTUpKTsKCnN0YXRpYyBzc2l6ZV90IGdldF9mYW5faW5wdXQoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX2lucHV0W24gLSAxXSwgZGF0YS0+ZmFuX2RpdltuIC0gMV0pKTsKfQoKc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl9taW4oc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltuIC0gMV0sIGRhdGEtPmZhbl9kaXZbbiAtIDFdKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IGdldF9mYW5fZGl2KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbiAtIDFdKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IGdldF9mYW5fb2ZmKHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+ZmFuX29mZik7Cn0KCnN0YXRpYyBzc2l6ZV90IHNldF9mYW5fbWluKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCnsKCXVuc2lnbmVkIGxvbmcgdiA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwoJdTggcjsKCgltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglyID0gRkFOX1RPX1JFRyh2LCBkYXRhLT5mYW5fZGl2W24gLSAxXSk7CglkYXRhLT5mYW5fbWluW24gLSAxXSA9IHI7CgoJaWYgKG4gPT0gMSkKCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgKGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCByZWcpICYgfjB4ZmYwMCkgfCAociA8PCA4KSk7CgllbHNlCgkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgcmVnKSAmIH4weGZmKSB8IHIpOwoKCWRhdGEtPmJlZXBfbWFzayA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9NQVNLKTsKCWlmIChkYXRhLT5mYW5fbWluW24gLSAxXSA9PSAwKQoJCWRhdGEtPmFsYXJtX21hc2sgJj0gKG4gPT0gMSkgPyB+MHgyMCA6IH4weDQwOwoJZWxzZQoJCWRhdGEtPmFsYXJtX21hc2sgfD0gKG4gPT0gMSkgPyAweDIwIDogMHg0MDsKCWRhdGEtPmJlZXBfbWFzayAmPSBkYXRhLT5hbGFybV9tYXNrOwoJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9NQVNLLCBkYXRhLT5iZWVwX21hc2spOwoKCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3NpemVfdCBzZXRfZmFuX2RpdihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQp7Cgl1bnNpZ25lZCBsb25nIHYgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKCXU4IHI7CgoJc3dpdGNoICh2KSB7CgljYXNlIDE6IHIgPSAwOyBicmVhazsKCWNhc2UgMjogciA9IDE7IGJyZWFrOwoJY2FzZSA0OiByID0gMjsgYnJlYWs7CgljYXNlIDg6IHIgPSAzOyBicmVhazsKCWRlZmF1bHQ6CgkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYW5fZGl2IHZhbHVlICVsZCBub3Qgc3VwcG9ydGVkLiBDaG9vc2Ugb25lIG9mIDEsIDIsIDQgb3IgOCFcbiIsIHYpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPmZhbl9kaXZbbiAtIDFdID0gcjsKCglpZiAobiA9PSAxKQoJCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHhjMCkgfCAociA8PCA2KSk7CgllbHNlCgkJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgcmVnKSAmIH4weDMwKSB8IChyIDw8IDQpKTsKCgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQoKc3RhdGljIHNzaXplX3Qgc2V0X2Zhbl9vZmYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKewoJdTggciA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApPzE6MDsKCgltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglkYXRhLT5mYW5fb2ZmID0gcjsKCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCAoZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIHJlZykgJiB+MHgwYykgfCAociA8PCAyKSk7CgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCXJldHVybiBjb3VudDsKfQoKI2RlZmluZSBURU1QX0ZST01fUkVHKHZhbCkgKCgodmFsKSAtIDEzMCkgKiAxMDAwKQojZGVmaW5lIFRFTVBfVE9fUkVHKHZhbCkgKFNFTlNPUlNfTElNSVQoKCgoKHZhbCk8MD8odmFsKS01MDA6KHZhbCkrNTAwKSAvIDEwMDApKzEzMCksMCwyNTUpKQoKc3RhdGljIHNzaXplX3QgZ2V0X3RlbXBfaW5wdXQoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfaW5wdXRbbiAtIDFdKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IGdldF90ZW1wX21heChzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY2hhciAqYnVmLCBpbnQgbikKewoJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVBfRlJPTV9SRUcoZGF0YS0+dGVtcF9tYXhbbiAtIDFdKSk7Cn0KCnN0YXRpYyBzc2l6ZV90IGdldF90ZW1wX21heF9oeXN0KHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjaGFyICpidWYsIGludCBuKQp7CglyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21heF9oeXN0W24gLSAxXSkpOwp9CgpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9tYXgoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKewoJbG9uZyB2ID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKCgltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglkYXRhLT50ZW1wX21heFtuIC0gMV0gPSBURU1QX1RPX1JFRyh2KTs7CglnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dGVtcF9tYXhbbiAtIDFdKTsKCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9tYXhfaHlzdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBuLCBpbnQgcmVnKQp7Cglsb25nIHYgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwoKCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCWRhdGEtPnRlbXBfbWF4X2h5c3RbbiAtIDFdID0gVEVNUF9UT19SRUcodik7CglnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIHJlZywgZGF0YS0+dGVtcF9tYXhfaHlzdFtuIC0gMV0pOwoJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglyZXR1cm4gY291bnQ7Cn0KCnN0YXRpYyBzc2l6ZV90IGdldF9hbGFybXMoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5hbGFybXMpOwp9CgpzdGF0aWMgc3NpemVfdCBnZXRfYmVlcF9lbmFibGUoc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5iZWVwX2VuYWJsZSk7Cn0KCnN0YXRpYyBzc2l6ZV90IGdldF9iZWVwX21hc2soc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNoYXIgKmJ1ZiwgaW50IG4pCnsKCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT5iZWVwX21hc2spOwp9CgpzdGF0aWMgc3NpemVfdCBzZXRfYmVlcF9lbmFibGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGdsNTIwX2RhdGEgKmRhdGEsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQgbiwgaW50IHJlZykKewoJdTggciA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApPzA6MTsKCgltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CglkYXRhLT5iZWVwX2VuYWJsZSA9ICFyOwoJZ2w1MjBfd3JpdGVfdmFsdWUoY2xpZW50LCByZWcsIChnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgcmVnKSAmIH4weDA0KSB8IChyIDw8IDIpKTsKCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgpzdGF0aWMgc3NpemVfdCBzZXRfYmVlcF9tYXNrKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBnbDUyMF9kYXRhICpkYXRhLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IG4sIGludCByZWcpCnsKCXU4IHIgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKCQoJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJciAmPSBkYXRhLT5hbGFybV9tYXNrOwoJZGF0YS0+YmVlcF9tYXNrID0gcjsKCWdsNTIwX3dyaXRlX3ZhbHVlKGNsaWVudCwgcmVnLCByKTsKCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwoJcmV0dXJuIGNvdW50Owp9CgoKLyoKICogUmVhbCBjb2RlCiAqLwoKc3RhdGljIGludCBnbDUyMF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCnsKCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKCQlyZXR1cm4gMDsKCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgZ2w1MjBfZGV0ZWN0KTsKfQoKc3RhdGljIGludCBnbDUyMF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCnsKCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OwoJc3RydWN0IGdsNTIwX2RhdGEgKmRhdGE7CglpbnQgZXJyID0gMDsKCglpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CgkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpCgkJZ290byBleGl0OwoKCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCgkgICBjbGllbnQgc3RydWN0dXJlLCBldmVuIHRob3VnaCB3ZSBjYW5ub3QgZmlsbCBpdCBjb21wbGV0ZWx5IHlldC4KCSAgIEJ1dCBpdCBhbGxvd3MgdXMgdG8gYWNjZXNzIGdsNTIwX3tyZWFkLHdyaXRlfV92YWx1ZS4gKi8KCglpZiAoIShkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdsNTIwX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKCQllcnIgPSAtRU5PTUVNOwoJCWdvdG8gZXhpdDsKCX0KCgluZXdfY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKCWkyY19zZXRfY2xpZW50ZGF0YShuZXdfY2xpZW50LCBkYXRhKTsKCW5ld19jbGllbnQtPmFkZHIgPSBhZGRyZXNzOwoJbmV3X2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CgluZXdfY2xpZW50LT5kcml2ZXIgPSAmZ2w1MjBfZHJpdmVyOwoJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOwoKCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLwoJaWYgKGtpbmQgPCAwKSB7CgkJaWYgKChnbDUyMF9yZWFkX3ZhbHVlKG5ld19jbGllbnQsIEdMNTIwX1JFR19DSElQX0lEKSAhPSAweDIwKSB8fAoJCSAgICAoKGdsNTIwX3JlYWRfdmFsdWUobmV3X2NsaWVudCwgR0w1MjBfUkVHX1JFVklTSU9OKSAmIDB4N2YpICE9IDB4MDApIHx8CgkJICAgICgoZ2w1MjBfcmVhZF92YWx1ZShuZXdfY2xpZW50LCBHTDUyMF9SRUdfQ09ORikgJiAweDgwKSAhPSAweDAwKSkgewoJCQlkZXZfZGJnKCZuZXdfY2xpZW50LT5kZXYsICJVbmtub3duIGNoaXAgdHlwZSwgc2tpcHBpbmdcbiIpOwoJCQlnb3RvIGV4aXRfZnJlZTsKCQl9Cgl9CgoJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgKi8KCXN0cmxjcHkobmV3X2NsaWVudC0+bmFtZSwgImdsNTIwc20iLCBJMkNfTkFNRV9TSVpFKTsKCWRhdGEtPnZhbGlkID0gMDsKCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCgkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCglpZiAoKGVyciA9IGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSkKCQlnb3RvIGV4aXRfZnJlZTsKCgkvKiBJbml0aWFsaXplIHRoZSBHTDUyMFNNIGNoaXAgKi8KCWdsNTIwX2luaXRfY2xpZW50KG5ld19jbGllbnQpOwoKCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCglkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJm5ld19jbGllbnQtPmRldik7CglpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CgkJZ290byBleGl0X2RldGFjaDsKCX0KCglkZXZpY2VfY3JlYXRlX2ZpbGVfdmlkKG5ld19jbGllbnQsIDApOwoKCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAwKTsKCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAxKTsKCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAyKTsKCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCAzKTsKCWlmICghZGF0YS0+dHdvX3RlbXBzKQoJCWRldmljZV9jcmVhdGVfZmlsZV9pbihuZXdfY2xpZW50LCA0KTsKCglkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKG5ld19jbGllbnQsIDEpOwoJZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihuZXdfY2xpZW50LCAyKTsKCWRldmljZV9jcmVhdGVfZmlsZV9mYW5fb2ZmKG5ld19jbGllbnQsIDEpOwoKCWRldmljZV9jcmVhdGVfZmlsZV90ZW1wKG5ld19jbGllbnQsIDEpOwoJaWYgKGRhdGEtPnR3b190ZW1wcykKCQlkZXZpY2VfY3JlYXRlX2ZpbGVfdGVtcChuZXdfY2xpZW50LCAyKTsKCglkZXZpY2VfY3JlYXRlX2ZpbGVfYWxhcm1zKG5ld19jbGllbnQpOwoKCXJldHVybiAwOwoKZXhpdF9kZXRhY2g6CglpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKZXhpdF9mcmVlOgoJa2ZyZWUoZGF0YSk7CmV4aXQ6CglyZXR1cm4gZXJyOwp9CgoKLyogQ2FsbGVkIHdoZW4gd2UgaGF2ZSBmb3VuZCBhIG5ldyBHTDUyMFNNLiAqLwpzdGF0aWMgdm9pZCBnbDUyMF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7CglzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJdTggb2xkY29uZiwgY29uZjsKCgljb25mID0gb2xkY29uZiA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQ09ORik7CgoJZGF0YS0+YWxhcm1fbWFzayA9IDB4ZmY7CglkYXRhLT52cm0gPSB2aWRfd2hpY2hfdnJtKCk7CgoJaWYgKGV4dHJhX3NlbnNvcl90eXBlID09IDEpCgkJY29uZiAmPSB+MHgxMDsKCWVsc2UgaWYgKGV4dHJhX3NlbnNvcl90eXBlID09IDIpCgkJY29uZiB8PSAweDEwOwoJZGF0YS0+dHdvX3RlbXBzID0gIShjb25mICYgMHgxMCk7CgoJLyogSWYgSVJRIyBpcyBkaXNhYmxlZCwgd2UgY2FuIHNhZmVseSBmb3JjZSBjb21wYXJhdG9yIG1vZGUgKi8KCWlmICghKGNvbmYgJiAweDIwKSkKCQljb25mICY9IDB4Zjc7CgoJLyogRW5hYmxlIG1vbml0b3JpbmcgaWYgbmVlZGVkICovCgljb25mIHw9IDB4NDA7CgoJaWYgKGNvbmYgIT0gb2xkY29uZikKCQlnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19DT05GLCBjb25mKTsKCglnbDUyMF91cGRhdGVfZGV2aWNlKCYoY2xpZW50LT5kZXYpKTsKCglpZiAoZGF0YS0+ZmFuX21pblswXSA9PSAwKQoJCWRhdGEtPmFsYXJtX21hc2sgJj0gfjB4MjA7CglpZiAoZGF0YS0+ZmFuX21pblsxXSA9PSAwKQoJCWRhdGEtPmFsYXJtX21hc2sgJj0gfjB4NDA7CgoJZGF0YS0+YmVlcF9tYXNrICY9IGRhdGEtPmFsYXJtX21hc2s7CglnbDUyMF93cml0ZV92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19CRUVQX01BU0ssIGRhdGEtPmJlZXBfbWFzayk7Cn0KCnN0YXRpYyBpbnQgZ2w1MjBfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQp7CglzdHJ1Y3QgZ2w1MjBfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwoJaW50IGVycjsKCglod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOwoKCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCgkJcmV0dXJuIGVycjsKCglrZnJlZShkYXRhKTsKCXJldHVybiAwOwp9CgoKLyogUmVnaXN0ZXJzIDB4MDcgdG8gMHgwYyBhcmUgd29yZC1zaXplZCwgb3RoZXJzIGFyZSBieXRlLXNpemVkIAogICBHTDUyMCB1c2VzIGEgaGlnaC1ieXRlIGZpcnN0IGNvbnZlbnRpb24gKi8Kc3RhdGljIGludCBnbDUyMF9yZWFkX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZykKewoJaWYgKChyZWcgPj0gMHgwNykgJiYgKHJlZyA8PSAweDBjKSkKCQlyZXR1cm4gc3dhYjE2KGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHJlZykpOwoJZWxzZQoJCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwp9CgpzdGF0aWMgaW50IGdsNTIwX3dyaXRlX3ZhbHVlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHJlZywgdTE2IHZhbHVlKQp7CglpZiAoKHJlZyA+PSAweDA3KSAmJiAocmVnIDw9IDB4MGMpKQoJCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBzd2FiMTYodmFsdWUpKTsKCWVsc2UKCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOwp9CgoKc3RhdGljIHN0cnVjdCBnbDUyMF9kYXRhICpnbDUyMF91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKewoJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKCXN0cnVjdCBnbDUyMF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CglpbnQgdmFsOwoKCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCglpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyAyICogSFopIHx8ICFkYXRhLT52YWxpZCkgewoKCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlN0YXJ0aW5nIGdsNTIwc20gdXBkYXRlXG4iKTsKCgkJZGF0YS0+YWxhcm1zID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19BTEFSTVMpOwoJCWRhdGEtPmJlZXBfbWFzayA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfQkVFUF9NQVNLKTsKCQlkYXRhLT52aWQgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1ZJRF9JTlBVVCkgJiAweDFmOwoKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOMF9MSU1JVCk7CgkJZGF0YS0+aW5fbWluWzBdID0gdmFsICYgMHhmZjsKCQlkYXRhLT5pbl9tYXhbMF0gPSAodmFsID4+IDgpICYgMHhmZjsKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOMV9MSU1JVCk7CgkJZGF0YS0+aW5fbWluWzFdID0gdmFsICYgMHhmZjsKCQlkYXRhLT5pbl9tYXhbMV0gPSAodmFsID4+IDgpICYgMHhmZjsKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOMl9MSU1JVCk7CgkJZGF0YS0+aW5fbWluWzJdID0gdmFsICYgMHhmZjsKCQlkYXRhLT5pbl9tYXhbMl0gPSAodmFsID4+IDgpICYgMHhmZjsKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lOM19MSU1JVCk7CgkJZGF0YS0+aW5fbWluWzNdID0gdmFsICYgMHhmZjsKCQlkYXRhLT5pbl9tYXhbM10gPSAodmFsID4+IDgpICYgMHhmZjsKCgkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19GQU5fSU5QVVQpOwoJCWRhdGEtPmZhbl9pbnB1dFswXSA9ICh2YWwgPj4gOCkgJiAweGZmOwoJCWRhdGEtPmZhbl9pbnB1dFsxXSA9IHZhbCAmIDB4ZmY7CgoJCXZhbCA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfRkFOX01JTik7CgkJZGF0YS0+ZmFuX21pblswXSA9ICh2YWwgPj4gOCkgJiAweGZmOwoJCWRhdGEtPmZhbl9taW5bMV0gPSB2YWwgJiAweGZmOwoKCQlkYXRhLT50ZW1wX2lucHV0WzBdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMV9JTlBVVCk7CgkJZGF0YS0+dGVtcF9tYXhbMF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX1RFTVAxX01BWCk7CgkJZGF0YS0+dGVtcF9tYXhfaHlzdFswXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfVEVNUDFfTUFYX0hZU1QpOwoKCQl2YWwgPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0ZBTl9ESVYpOwoJCWRhdGEtPmZhbl9kaXZbMF0gPSAodmFsID4+IDYpICYgMHgwMzsKCQlkYXRhLT5mYW5fZGl2WzFdID0gKHZhbCA+PiA0KSAmIDB4MDM7CgkJZGF0YS0+ZmFuX29mZiA9ICh2YWwgPj4gMikgJiAweDAxOwoKCQlkYXRhLT5hbGFybXMgJj0gZGF0YS0+YWxhcm1fbWFzazsKCgkJdmFsID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19DT05GKTsKCQlkYXRhLT5iZWVwX2VuYWJsZSA9ICEoKHZhbCA+PiAyKSAmIDEpOwoKCQlkYXRhLT5pbl9pbnB1dFswXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4wX0lOUFVUKTsKCQlkYXRhLT5pbl9pbnB1dFsxXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4xX0lOUFVUKTsKCQlkYXRhLT5pbl9pbnB1dFsyXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4yX0lOUFVUKTsKCQlkYXRhLT5pbl9pbnB1dFszXSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU4zX0lOUFVUKTsKCgkJLyogVGVtcDEgYW5kIFZpbjQgYXJlIHRoZSBzYW1lIGlucHV0ICovCgkJaWYgKGRhdGEtPnR3b190ZW1wcykgewoJCQlkYXRhLT50ZW1wX2lucHV0WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMl9JTlBVVCk7CgkJCWRhdGEtPnRlbXBfbWF4WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMl9NQVgpOwoJCQlkYXRhLT50ZW1wX21heF9oeXN0WzFdID0gZ2w1MjBfcmVhZF92YWx1ZShjbGllbnQsIEdMNTIwX1JFR19URU1QMl9NQVhfSFlTVCk7CgkJfSBlbHNlIHsKCQkJZGF0YS0+aW5faW5wdXRbNF0gPSBnbDUyMF9yZWFkX3ZhbHVlKGNsaWVudCwgR0w1MjBfUkVHX0lONF9JTlBVVCk7CgkJCWRhdGEtPmluX21pbls0XSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU40X01JTik7CgkJCWRhdGEtPmluX21heFs0XSA9IGdsNTIwX3JlYWRfdmFsdWUoY2xpZW50LCBHTDUyMF9SRUdfSU40X01BWCk7CgkJfQoKCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOwoJCWRhdGEtPnZhbGlkID0gMTsKCX0KCgltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKCglyZXR1cm4gZGF0YTsKfQoKCnN0YXRpYyBpbnQgX19pbml0IHNlbnNvcnNfZ2w1MjBzbV9pbml0KHZvaWQpCnsKCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZ2w1MjBfZHJpdmVyKTsKfQoKc3RhdGljIHZvaWQgX19leGl0IHNlbnNvcnNfZ2w1MjBzbV9leGl0KHZvaWQpCnsKCWkyY19kZWxfZHJpdmVyKCZnbDUyMF9kcml2ZXIpOwp9CgoKTU9EVUxFX0FVVEhPUigiRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwgIgoJIkt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiwgIgoJIk1hYXJ0ZW4gRGVwcmV6IDxtYWFydGVuZGVwcmV6QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJHTDUyMFNNIGRyaXZlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfaW5pdChzZW5zb3JzX2dsNTIwc21faW5pdCk7Cm1vZHVsZV9leGl0KHNlbnNvcnNfZ2w1MjBzbV9leGl0KTsK