LyogQm9vc3QgaW50ZXJ2YWwvZGV0YWlsL2FscGhhX3JvdW5kaW5nX2NvbnRyb2wuaHBwIGZpbGUKICoKICogQ29weXJpZ2h0IDIwMDUgRmVsaXggSPZmbGluZywgR3VpbGxhdW1lIE1lbHF1aW9uZAogKgogKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCiAqIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yCiAqIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQogKi8KCiNpZm5kZWYgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9ERVRBSUxfQUxQSEFfUk9VTkRJTkdfQ09OVFJPTF9IUFAKI2RlZmluZSBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0RFVEFJTF9BTFBIQV9ST1VORElOR19DT05UUk9MX0hQUAoKI2lmICFkZWZpbmVkKGFscGhhKSAmJiAhZGVmaW5lZChfX2FscGhhX18pCiNlcnJvciBUaGlzIGhlYWRlciBvbmx5IHdvcmtzIG9uIEFscGhhIENQVXMuCiNlbmRpZgoKI2lmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19kaWdpdGFsX18pIHx8IGRlZmluZWQoX19ERUNDWFgpCgojaW5jbHVkZSA8ZmxvYXQuaD4gLy8gd3JpdGVfcm5kKCkgYW5kIHJlYWRfcm5kKCkKCm5hbWVzcGFjZSBib29zdCB7Cm5hbWVzcGFjZSBudW1lcmljIHsKbmFtZXNwYWNlIGludGVydmFsX2xpYiB7CgpuYW1lc3BhY2UgZGV0YWlsIHsKI2lmIGRlZmluZWQoX19HTlVDX18gKQogICAgdHlwZWRlZiB1bmlvbiB7CiAgICA6OmJvb3N0Ojpsb25nX2xvbmdfdHlwZSBpbW9kZTsKICAgIGRvdWJsZSBkbW9kZTsKICAgIH0gcm91bmRpbmdfbW9kZV9zdHJ1Y3Q7CgogICAgLy8gc2V0IGJpdHMgNTktNTggKERZTiksCiAgICAvLyBjbGVhciBhbGwgZXhjZXB0aW9uIGJpdHMgYW5kIGRpc2FibGUgb3ZlcmZsb3cgKDUxKSBhbmQgaW5leGFjdCBleGNlcHRpb25zICg2MikKICAgIHN0YXRpYyBjb25zdCByb3VuZGluZ19tb2RlX3N0cnVjdCBtb2RlX3Vwd2FyZCAgICAgID0geyAweDRDMDgwMDAwMDAwMDAwMDBMTCB9OwogICAgc3RhdGljIGNvbnN0IHJvdW5kaW5nX21vZGVfc3RydWN0IG1vZGVfZG93bndhcmQgICAgPSB7IDB4NDQwODAwMDAwMDAwMDAwMExMIH07CiAgICBzdGF0aWMgY29uc3Qgcm91bmRpbmdfbW9kZV9zdHJ1Y3QgbW9kZV90b19uZWFyZXN0ICA9IHsgMHg0ODA4MDAwMDAwMDAwMDAwTEwgfTsKICAgIHN0YXRpYyBjb25zdCByb3VuZGluZ19tb2RlX3N0cnVjdCBtb2RlX3Rvd2FyZF96ZXJvID0geyAweDQwMDgwMDAwMDAwMDAwMDBMTCB9OwoKICAgIHN0cnVjdCBhbHBoYV9yb3VuZGluZ19jb250cm9sCiAgICB7CiAgICB0eXBlZGVmIGRvdWJsZSByb3VuZGluZ19tb2RlOwoKICAgIHN0YXRpYyB2b2lkIHNldF9yb3VuZGluZ19tb2RlKGNvbnN0IHJvdW5kaW5nX21vZGUgbW9kZSkKICAgIHsgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtdF9mcGNyICUwIiA6IDogImYiKG1vZGUpKTsgfQoKICAgIHN0YXRpYyB2b2lkIGdldF9yb3VuZGluZ19tb2RlKHJvdW5kaW5nX21vZGUmIG1vZGUpCiAgICB7IF9fYXNtX18gX192b2xhdGlsZV9fICgibWZfZnBjciAlMCIgOiAiPWYiKG1vZGUpKTsgfQoKICAgIHN0YXRpYyB2b2lkIGRvd253YXJkKCkgICAgeyBzZXRfcm91bmRpbmdfbW9kZShtb2RlX2Rvd253YXJkLmRtb2RlKTsgICAgfQogICAgc3RhdGljIHZvaWQgdXB3YXJkKCkgICAgICB7IHNldF9yb3VuZGluZ19tb2RlKG1vZGVfdXB3YXJkLmRtb2RlKTsgICAgICB9CiAgICBzdGF0aWMgdm9pZCB0b19uZWFyZXN0KCkgIHsgc2V0X3JvdW5kaW5nX21vZGUobW9kZV90b19uZWFyZXN0LmRtb2RlKTsgIH0KICAgIHN0YXRpYyB2b2lkIHRvd2FyZF96ZXJvKCkgeyBzZXRfcm91bmRpbmdfbW9kZShtb2RlX3Rvd2FyZF96ZXJvLmRtb2RlKTsgfQogICAgfTsKI2VsaWYgZGVmaW5lZChfX2RpZ2l0YWxfXykgfHwgZGVmaW5lZChfX0RFQ0NYWCkKCiNpZiBkZWZpbmVkKF9fREVDQ1hYKSAmJiAhKGRlZmluZWQoX19GTFRfUk9VTkRTKSAmJiBfX0ZMVF9ST1VORFMgPT0gLTEpCiNlcnJvciBEeW5hbWljIHJvdW5kaW5nIG1vZGUgbm90IGVuYWJsZWQuIFNlZSBjeHggbWFuIHBhZ2UgZm9yIGRldGFpbHMuCiNlbmRpZgoKICAgIHN0cnVjdCBhbHBoYV9yb3VuZGluZ19jb250cm9sCiAgICB7CiAgICB0eXBlZGVmIHVuc2lnbmVkIGludCByb3VuZGluZ19tb2RlOwoKICAgIHN0YXRpYyB2b2lkIHNldF9yb3VuZGluZ19tb2RlKGNvbnN0IHJvdW5kaW5nX21vZGUmIG1vZGUpICB7IHdyaXRlX3JuZChtb2RlKTsgfQogICAgc3RhdGljIHZvaWQgZ2V0X3JvdW5kaW5nX21vZGUocm91bmRpbmdfbW9kZSYgbW9kZSkgIHsgbW9kZSA9IHJlYWRfcm5kKCk7IH0KCiAgICBzdGF0aWMgdm9pZCBkb3dud2FyZCgpICAgIHsgc2V0X3JvdW5kaW5nX21vZGUoRlBfUk5EX1JNKTsgfQogICAgc3RhdGljIHZvaWQgdXB3YXJkKCkgICAgICB7IHNldF9yb3VuZGluZ19tb2RlKEZQX1JORF9SUCk7IH0KICAgIHN0YXRpYyB2b2lkIHRvX25lYXJlc3QoKSAgeyBzZXRfcm91bmRpbmdfbW9kZShGUF9STkRfUk4pOyB9CiAgICBzdGF0aWMgdm9pZCB0b3dhcmRfemVybygpIHsgc2V0X3JvdW5kaW5nX21vZGUoRlBfUk5EX1JaKTsgfQogICAgfTsKI2VuZGlmCn0gLy8gbmFtZXNwYWNlIGRldGFpbAoKZXh0ZXJuICJDIiB7CiAgZmxvYXQgcmludGYoZmxvYXQpOwogIGRvdWJsZSByaW50KGRvdWJsZSk7CiAgbG9uZyBkb3VibGUgcmludGwobG9uZyBkb3VibGUpOwp9Cgp0ZW1wbGF0ZTw+CnN0cnVjdCByb3VuZGluZ19jb250cm9sPGZsb2F0PjoKICBkZXRhaWw6OmFscGhhX3JvdW5kaW5nX2NvbnRyb2wKewogIHN0YXRpYyBmbG9hdCBmb3JjZV9yb3VuZGluZyhjb25zdCBmbG9hdCByKQogIHsgdm9sYXRpbGUgZmxvYXQgX3IgPSByOyByZXR1cm4gX3I7IH0KICBzdGF0aWMgZmxvYXQgdG9faW50KGNvbnN0IGZsb2F0JiB4KSB7IHJldHVybiByaW50Zih4KTsgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3Qgcm91bmRpbmdfY29udHJvbDxkb3VibGU+OgogIGRldGFpbDo6YWxwaGFfcm91bmRpbmdfY29udHJvbAp7CiAgc3RhdGljIGNvbnN0IGRvdWJsZSAmIGZvcmNlX3JvdW5kaW5nKGNvbnN0IGRvdWJsZSYgcikgeyByZXR1cm4gcjsgfQogIHN0YXRpYyBkb3VibGUgdG9faW50KGNvbnN0IGRvdWJsZSYgcikgeyByZXR1cm4gcmludChyKTsgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3Qgcm91bmRpbmdfY29udHJvbDxsb25nIGRvdWJsZT46CiAgZGV0YWlsOjphbHBoYV9yb3VuZGluZ19jb250cm9sCnsKICBzdGF0aWMgY29uc3QgbG9uZyBkb3VibGUgJiBmb3JjZV9yb3VuZGluZyhjb25zdCBsb25nIGRvdWJsZSYgcikgeyByZXR1cm4gcjsgfQogIHN0YXRpYyBsb25nIGRvdWJsZSB0b19pbnQoY29uc3QgbG9uZyBkb3VibGUmIHIpIHsgcmV0dXJuIHJpbnRsKHIpOyB9Cn07Cgp9IC8vIG5hbWVzcGFjZSBpbnRlcnZhbF9saWIKfSAvLyBuYW1lc3BhY2UgbnVtZXJpYwp9IC8vIG5hbWVzcGFjZSBib29zdAoKI3VuZGVmIEJPT1NUX05VTUVSSUNfSU5URVJWQUxfTk9fSEFSRFdBUkUKI2VuZGlmCgojZW5kaWYgLyogQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9ERVRBSUxfQUxQSEFfUk9VTkRJTkdfQ09OVFJPTF9IUFAgKi8K