LyoKICogKEMpIENvcHlyaWdodCAyMDAzCiAqIERhdmlkIE38bGxlciBFTFNPRlQgQUcgU3dpdHplcmxhbmQuIGQubXVlbGxlckBlbHNvZnQuY2gKICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5BTUUJICAgIDogczNjMjQwMC5oCiAqIFZlcnNpb24gIDogMzEuMy4yMDAzCiAqCiAqIEJhc2VkIG9uIFMzQzI0MDBYIFVzZXIncyBtYW51YWwgUmV2IDEuMQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmbmRlZiBfX1MzQzI0MDBfSF9fCiNkZWZpbmUgX19TM0MyNDAwX0hfXwoKI2RlZmluZSBTM0MyNFgwX1VBUlRfQ0hBTk5FTFMJMgojZGVmaW5lIFMzQzI0WDBfU1BJX0NIQU5ORUxTCTEKI2RlZmluZSBQQUxFVFRFCQkJKDB4MTRBMDA0MDApCS8qIFNKUyAqLwoKZW51bSBzM2MyNHgwX3VhcnRzX25yIHsKCVMzQzI0WDBfVUFSVDAsCglTM0MyNFgwX1VBUlQxLAp9OwoKLypTM0MyNDAwIGRldmljZSBiYXNlIGFkZHJlc3NlcyAqLwojZGVmaW5lIFMzQzI0WDBfTUVNQ1RMX0JBU0UJCTB4MTQwMDAwMDAKI2RlZmluZSBTM0MyNFgwX1VTQl9IT1NUX0JBU0UJCTB4MTQyMDAwMDAKI2RlZmluZSBTM0MyNFgwX0lOVEVSUlVQVF9CQVNFCQkweDE0NDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9ETUFfQkFTRQkJMHgxNDYwMDAwMAojZGVmaW5lIFMzQzI0WDBfQ0xPQ0tfUE9XRVJfQkFTRQkweDE0ODAwMDAwCiNkZWZpbmUgUzNDMjRYMF9MQ0RfQkFTRQkJMHgxNEEwMDAwMAojZGVmaW5lIFMzQzI0WDBfVUFSVF9CQVNFCQkweDE1MDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9USU1FUl9CQVNFCQkweDE1MTAwMDAwCiNkZWZpbmUgUzNDMjRYMF9VU0JfREVWSUNFX0JBU0UJCTB4MTUyMDAxNDAKI2RlZmluZSBTM0MyNFgwX1dBVENIRE9HX0JBU0UJCTB4MTUzMDAwMDAKI2RlZmluZSBTM0MyNFgwX0kyQ19CQVNFCQkweDE1NDAwMDAwCiNkZWZpbmUgUzNDMjRYMF9JMlNfQkFTRQkJMHgxNTUwODAwMAojZGVmaW5lIFMzQzI0WDBfR1BJT19CQVNFCQkweDE1NjAwMDAwCiNkZWZpbmUgUzNDMjRYMF9SVENfQkFTRQkJMHgxNTcwMDAwMAojZGVmaW5lIFMzQzI0WDBfQURDX0JBU0UJCTB4MTU4MDAwMDAKI2RlZmluZSBTM0MyNFgwX1NQSV9CQVNFCQkweDE1OTAwMDAwCiNkZWZpbmUgUzNDMjQwMF9NTUNfQkFTRQkJMHgxNUEwMDAwMAoKLyogaW5jbHVkZSBjb21tb24gc3R1ZmYgKi8KI2luY2x1ZGUgPGFzbS9hcmNoL3MzYzI0eDAuaD4KCgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX21lbWN0bCAqczNjMjR4MF9nZXRfYmFzZV9tZW1jdGwodm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF9tZW1jdGwgKilTM0MyNFgwX01FTUNUTF9CQVNFOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX3VzYl9ob3N0ICpzM2MyNHgwX2dldF9iYXNlX3VzYl9ob3N0KHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfdXNiX2hvc3QgKilTM0MyNFgwX1VTQl9IT1NUX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfaW50ZXJydXB0ICpzM2MyNHgwX2dldF9iYXNlX2ludGVycnVwdCh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX2ludGVycnVwdCAqKVMzQzI0WDBfSU5URVJSVVBUX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfZG1hcyAqczNjMjR4MF9nZXRfYmFzZV9kbWFzKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfZG1hcyAqKVMzQzI0WDBfRE1BX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfY2xvY2tfcG93ZXIgKnMzYzI0eDBfZ2V0X2Jhc2VfY2xvY2tfcG93ZXIodm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF9jbG9ja19wb3dlciAqKVMzQzI0WDBfQ0xPQ0tfUE9XRVJfQkFTRTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF9sY2QgKnMzYzI0eDBfZ2V0X2Jhc2VfbGNkKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfbGNkICopUzNDMjRYMF9MQ0RfQkFTRTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgczNjMjR4MF91YXJ0CgkqczNjMjR4MF9nZXRfYmFzZV91YXJ0KGVudW0gczNjMjR4MF91YXJ0c19uciBuKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX3VhcnQgKikoUzNDMjRYMF9VQVJUX0JBU0UgKyAobiAqIDB4NDAwMCkpOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX3RpbWVycyAqczNjMjR4MF9nZXRfYmFzZV90aW1lcnModm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF90aW1lcnMgKilTM0MyNFgwX1RJTUVSX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfdXNiX2RldmljZSAqczNjMjR4MF9nZXRfYmFzZV91c2JfZGV2aWNlKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfdXNiX2RldmljZSAqKVMzQzI0WDBfVVNCX0RFVklDRV9CQVNFOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX3dhdGNoZG9nICpzM2MyNHgwX2dldF9iYXNlX3dhdGNoZG9nKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfd2F0Y2hkb2cgKilTM0MyNFgwX1dBVENIRE9HX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfaTJjICpzM2MyNHgwX2dldF9iYXNlX2kyYyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX2kyYyAqKVMzQzI0WDBfSTJDX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfaTJzICpzM2MyNHgwX2dldF9iYXNlX2kycyh2b2lkKQp7CglyZXR1cm4gKHN0cnVjdCBzM2MyNHgwX2kycyAqKVMzQzI0WDBfSTJTX0JBU0U7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IHMzYzI0eDBfZ3BpbyAqczNjMjR4MF9nZXRfYmFzZV9ncGlvKHZvaWQpCnsKCXJldHVybiAoc3RydWN0IHMzYzI0eDBfZ3BpbyAqKVMzQzI0WDBfR1BJT19CQVNFOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX3J0YyAqczNjMjR4MF9nZXRfYmFzZV9ydGModm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF9ydGMgKilTM0MyNFgwX1JUQ19CQVNFOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNDAwX2FkYyAqczNjMjQwMF9nZXRfYmFzZV9hZGModm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjQwMF9hZGMgKilTM0MyNFgwX0FEQ19CQVNFOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNHgwX3NwaSAqczNjMjR4MF9nZXRfYmFzZV9zcGkodm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjR4MF9zcGkgKilTM0MyNFgwX1NQSV9CQVNFOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBzM2MyNDAwX21tYyAqczNjMjQwMF9nZXRfYmFzZV9tbWModm9pZCkKewoJcmV0dXJuIChzdHJ1Y3QgczNjMjQwMF9tbWMgKilTM0MyNDAwX01NQ19CQVNFOwp9CgojZW5kaWYgLypfX1MzQzI0MDBfSF9fKi8K