I2lmbmRlZiBaTU9ERU1fR0xPQkFMX0gKI2RlZmluZSBaTU9ERU1fR0xPQkFMX0gKCi8qIHpnbG9iYWwuaCAtIHByb3RvdHlwZXMgZXRjZXRlcmEgZm9yIGxyenN6CgogIENvcHlyaWdodCAoQykgdW50aWwgMTk5OCBDaHVjayBGb3JzYmVyZyAoT01FTiBUZWNobm9sb2d5IEluYykKICBDb3B5cmlnaHQgKEMpIDE5OTQgTWF0dCBQb3J0ZXIKICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgVXdlIE9oc2UKCiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKICBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQogIDAyMTExLTEzMDcsIFVTQS4KKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKI2lmZGVmIF9fR05VQ19fCiNpZm5kZWYgSEFWRV9BTExPQ0EKIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQojZW5kaWYKI2Vsc2UKIyBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQwojICBpbmNsdWRlIDxhbGxvY2EuaD4KIyBlbHNlCiMgIGlmZGVmIF9BSVgKI3ByYWdtYSBhbGxvY2EKIyAgZWxzZQojICAgaWZuZGVmIGFsbG9jYQojICAgIGlmbmRlZiBfX0dMSUJDX18KY2hhciAqYWxsb2NhICgpOwojICAgIGVuZGlmCiMgICBlbmRpZgojICBlbmRpZgojIGVuZGlmCiNlbmRpZgoKI2lmbmRlZiBfX1AKI2lmIGRlZmluZWQgKF9fR05VQ19fKSB8fCAoZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fKQojZGVmaW5lIF9fUChhcmdzKSBhcmdzCiNlbHNlCiNkZWZpbmUgX19QKGFyZ3MpICgpCiNlbmRpZiAgLyogR0NDLiAgKi8KI2VuZGlmICAvKiBOb3QgX19QLiAgKi8KCiNpZmRlZiBfX1NURENfXwojaW5jbHVkZSA8c3RkYXJnLmg+CiNlbHNlCiNpbmNsdWRlIDx2YXJhcmdzLmg+CiNlbmRpZgoKI2lmZGVmIFRJTUVfV0lUSF9TWVNfVElNRQojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojICBpbmNsdWRlIDx0aW1lLmg+CiMgIGRlZmluZSBJTkNMVURFRF9TWVNfVElNRQojZWxzZQojICBpZmRlZiBIQVZFX1NZU19USU1FX0gKIyAgICBpbmNsdWRlIDxzeXMvdGltZS5oPgojICAgIGRlZmluZSBJTkNMVURFRF9TWVNfVElNRQojICBlbHNlCiMgICAgaW5jbHVkZSA8dGltZS5oPgojICBlbmRpZgojZW5kaWYKI2lmZGVmIFNZU19USU1FX1dJVEhPVVRfU1lTX1NFTEVDVAojIGlmZGVmIElOQ0xVREVEX1NZU19USU1FCiMgIHVuZGVmIEhBVkVfU1lTX1NFTEVDVF9ICiMgZW5kaWYKI2VuZGlmCgoKI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICiMgIGluY2x1ZGUgPHN5cy9zZWxlY3QuaD4KI2VuZGlmCiNpZmRlZiBfX0JFT1NfXwogLyogQmVPUyA0LjA6IHN5cy9zZWxlY3QuaCBpcyBhbG1vc3QgY29tcGxldGVseSAjaWZkZWZkIG91dCAqLwojZGVmaW5lICBIQVZFX1NPQ0tFVF9ICiNpZmRlZiBIQVZFX1NPQ0tFVF9ICiNpbmNsdWRlIDxzb2NrZXQuaD4KI2VuZGlmCiNlbmRpZgoKI2lmIFNURENfSEVBREVSUwojIGluY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojIGlmZGVmIEhBVkVfU1RSSU5HU19ICiMgICBpbmNsdWRlIDxzdHJpbmdzLmg+CiMgZW5kaWYKIyBpZm5kZWYgSEFWRV9TVFJDSFIKIyAgZGVmaW5lIHN0cmNociBpbmRleAojICBkZWZpbmUgc3RycmNociByaW5kZXgKIyBlbmRpZgpjaGFyICpzdHJjaHIgKCksICpzdHJyY2hyICgpOwojIGlmbmRlZiBIQVZFX01FTUNQWQojICBkZWZpbmUgbWVtY3B5KGQsIHMsIG4pIGJjb3B5ICgocyksIChkKSwgKG4pKQojICBkZWZpbmUgbWVtbW92ZShkLCBzLCBuKSBiY29weSAoKHMpLCAoZCksIChuKSkKIyBlbmRpZgojZW5kaWYKCiNpbmNsdWRlIDxzeXMvc3RhdC5oPgoKLyogd2UgbmVlZCB0byBkZWNpZGUgd2hldGhlciByZWFkY2hlY2sgaXMgcG9zc2libGUgKi8KI2lmZGVmIEhBVkVfRkNOVExfSAojICBpbmNsdWRlIDxmY250bC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfU1lTX0lPQ1RMX0gKIyAgaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgojaWZkZWYgSEFWRV9SRENISwojICBkZWZpbmUgUkVBRENIRUNLCiNlbHNlCiMgIGlmZGVmIEZJT05SRUFECiMgICAgZGVmaW5lIFJFQURDSEVDS19GSU9OUkVBRAojICAgIGRlZmluZSBSRUFEQ0hFQ0sKIyAgZWxzZQojICAgIGlmZGVmIEZfR0VURkwKIyAgICAgIGRlZmluZSBSRUFEQ0hFQ0sKIyAgICAgIGRlZmluZSBSRUFEQ0hFQ0tfUkVBRFMKIyAgICAgIGRlZmluZSBSRUFEQ0hFQ0tfR0VURkwKIyAgICBlbmRpZgojICBlbmRpZgojZW5kaWYKCi8qIHVzZWQgdG8gdXNlICNlbGlmLCBidXQgbmF0aXZlIGJyYWluZGVhZCBocHV4IDkuMDAgYyBjb21waWxlciBkaWRuJ3QgCiAqIHVuZGVyc3RhbmQgaXQgKi8KI2lmZGVmIEhBVkVfVEVSTUlPU19ICi8qIGdldCByaWQgb2Ygd2FybmluZ3Mgb24gU0NPIE9EVCAzLjIgKi8Kc3RydWN0IHRlcm1pb3M7CiMgaW5jbHVkZSA8dGVybWlvcy5oPgojIGRlZmluZSBVU0VfVEVSTUlPUwojZWxzZQojIGlmIGRlZmluZWQoSEFWRV9TWVNfVEVSTUlPU19IKQojICBpbmNsdWRlIDxzeXMvdGVybWlvcy5oPgojICBkZWZpbmUgVVNFX1RFUk1JT1MKIyBlbHNlCiMgIGlmIGRlZmluZWQoSEFWRV9URVJNSU9fSCkKIyAgIGluY2x1ZGUgPHRlcm1pby5oPgojICAgZGVmaW5lIFVTRV9URVJNSU8KIyAgZWxzZQojICAgaWYgZGVmaW5lZChIQVZFX1NZU19URVJNSU9fSCkKIyAgICBpbmNsdWRlIDxzeXMvdGVybWlvLmg+CiMgICAgZGVmaW5lIFVTRV9URVJNSU8KIyAgIGVsc2UKIyAgICBpZiBkZWZpbmVkKEhBVkVfU0dUVFlfSCkKIyAgICAgaW5jbHVkZSA8c2d0dHkuaD4KIyAgICAgZGVmaW5lIFVTRV9TR1RUWQojICAgICBpZmRlZiBMTElUT1VUCiAgICAgICBleHRlcm4gbG9uZyBMb2Ntb2RlOwkJLyogU2F2ZWQgImxvY2FsIG1vZGUiIGZvciA0LnggQlNEICJuZXcgZHJpdmVyIiAqLwogICAgICAgZXh0ZXJuIGxvbmcgTG9jYml0OwkvKiBCaXQgU1VQUE9TRUQgdG8gZGlzYWJsZSBvdXRwdXQgdHJhbnNsYXRpb25zICovCiMgICAgIGVuZGlmCiMgICAgZWxzZQojICAgICBlcnJvciBuZWl0aGVyIHRlcm1pby5oIG5vciBzZ3R0eS5oIGZvdW5kLiBDYW5ub3QgY29udGludWUuCiMgICAgZW5kaWYKIyAgIGVuZGlmCiMgIGVuZGlmCiMgZW5kaWYKI2VuZGlmCgojaWZkZWYgVVNFX1NHVFRZCiMgIGlmZGVmIFRJT0NTQlJLCiMgICAgZGVmaW5lIENBTkJSRUFLCiMgIGVuZGlmCiNlbmRpZgojaWZkZWYgVVNFX1RFUk1JTwojICBkZWZpbmUgQ0FOQlJFQUsKI2VuZGlmCgoKCi8qIFRha2UgY2FyZSBvZiBOTFMgbWF0dGVycy4gICovCiNpZiBIQVZFX0xPQ0FMRV9ICiMgaW5jbHVkZSA8bG9jYWxlLmg+CiNlbmRpZgojaWYgIUhBVkVfU0VUTE9DQUxFCiMgZGVmaW5lIHNldGxvY2FsZShDYXRlZ29yeSwgTG9jYWxlKSAvKiBlbXB0eSAqLwojZW5kaWYKCiNpZiBFTkFCTEVfTkxTCiMgaW5jbHVkZSA8bGliaW50bC5oPgojIGRlZmluZSBfKFRleHQpIGdldHRleHQgKFRleHQpCiNlbHNlCiMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbiwgRGlyZWN0b3J5KSAvKiBlbXB0eSAqLwojIGRlZmluZSB0ZXh0ZG9tYWluKERvbWFpbikgLyogZW1wdHkgKi8KIyBkZWZpbmUgXyhUZXh0KSBUZXh0CiNlbmRpZgoKI2lmbmRlZiBFTkFCTEVfU1lTTE9HCiMgIHVuZGVmIEhBVkVfU1lTTE9HCiNlbHNlCiMgIGlmZGVmIEhBVkVfU1lTTE9HX0gKIyAgICBpbmNsdWRlIDxzeXNsb2cuaD4KIyAgZWxzZQojICAgIGlmIGRlZmluZWQoSEFWRV9TWVNfU1lTTE9HX0gpCiMgICAgICBpbmNsdWRlIDxzeXMvc3lzbG9nLmg+CiMgICAgZWxzZQojICAgICAgdW5kZWYgSEFWRV9TWVNMT0cKIyAgICBlbmRpZgojICBlbmRpZgojZW5kaWYKI2lmbmRlZiBFTkFCTEVfU1lTTE9HCiMgIGRlZmluZSBvcGVubG9nKG5hbWUscGlkLGZhY2lsaXR5KSAvKiB2b2lkIGl0ICovCiMgIGRlZmluZSBzZXRsb2dtYXNrKHgpIC8qIHZvaWQgaXQgKi8KI2Vsc2UKZXh0ZXJuIGludCBlbmFibGVfc3lzbG9nOwojZW5kaWYKCiNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0gKIyBpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCi8qIFRoZSBmb2xsb3dpbmcgaXMgZnJvbSBwYXRobWF4LmguICAqLwovKiBOb24tUE9TSVggQlNEIHN5c3RlbXMgbWlnaHQgaGF2ZSBnY2MncyBsaW1pdHMuaCwgd2hpY2ggZG9lc24ndCBkZWZpbmUKICAgUEFUSF9NQVggYnV0IG1pZ2h0IGNhdXNlIHJlZGVmaW5pdGlvbiB3YXJuaW5ncyB3aGVuIHN5cy9wYXJhbS5oIGlzCiAgIGxhdGVyIGluY2x1ZGVkIChhcyBvbiBNT1JFL0JTRCA0LjMpLiAgKi8KI2lmIGRlZmluZWQoX1BPU0lYX1ZFUlNJT04pIHx8IChkZWZpbmVkKEhBVkVfTElNSVRTX0gpICYmICFkZWZpbmVkKF9fR05VQ19fKSkKIyBpbmNsdWRlIDxsaW1pdHMuaD4KI2VuZGlmCgojaWZuZGVmIF9QT1NJWF9QQVRIX01BWAojIGRlZmluZSBfUE9TSVhfUEFUSF9NQVggMjU1CiNlbmRpZgoKI2lmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiBkZWZpbmVkKF9QQ19QQVRIX01BWCkKIyBkZWZpbmUgUEFUSF9NQVggKHBhdGhjb25mICgiLyIsIF9QQ19QQVRIX01BWCkgPCAxID8gMTAyNCA6IHBhdGhjb25mICgiLyIsIF9QQ19QQVRIX01BWCkpCiNlbmRpZgoKLyogRG9uJ3QgaW5jbHVkZSBzeXMvcGFyYW0uaCBpZiBpdCBhbHJlYWR5IGhhcyBiZWVuLiAgKi8KI2lmIGRlZmluZWQoSEFWRV9TWVNfUEFSQU1fSCkgJiYgIWRlZmluZWQoUEFUSF9NQVgpICYmICFkZWZpbmVkKE1BWFBBVEhMRU4pCiMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgoKI2lmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiBkZWZpbmVkKE1BWFBBVEhMRU4pCiMgZGVmaW5lIFBBVEhfTUFYIE1BWFBBVEhMRU4KI2VuZGlmCgojaWYgIWRlZmluZWQoTE9OR19NQVgpICYmIGRlZmluZWQoSEFWRV9MSU1JVFNfSCkKIyBpbmNsdWRlIDxsaW1pdHMuaD4KI2VuZGlmCgojaWZuZGVmIFBBVEhfTUFYCiMgZGVmaW5lIFBBVEhfTUFYIF9QT1NJWF9QQVRIX01BWAojZW5kaWYKCiNpZmRlZiBfX0dOVUNfXwoKI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+IDUpCiMgZGVmaW5lIExSWlNaX0FUVFJJQl9TRUNUSU9OKHgpIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oI3gpKSkKI2VuZGlmCgojaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID4gNCkKIyBkZWZpbmUgTFJaU1pfQVRUUklCX0NPTlNUICBfX2F0dHJpYnV0ZV9fKChfX2NvbnN0X18pKQojZW5kaWYKCiAgICAvKiBnY2MuaW5mbyBzYWd0LCBub3JldHVybiB35HJlIGFiIDIuNSB2ZXJm/GdiYXIuIEhQVVgtZ2NjIDIuNS44CiAgICAgKiBrYW5uIGVzIG5vY2ggbmljaHQgLSB3aGF0J3MgdGhpcz8KICAgICAqLwojaWYgX19HTlVDX18gPiAyIHx8IChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID4gNSkKIyBkZWZpbmUgTFJaU1pfQVRUUklCX05PUkVUICBfX2F0dHJpYnV0ZV9fKChfX25vcmV0dXJuX18pKQojZW5kaWYKCiNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPiA1KQojIGRlZmluZSBMUlpTWl9BVFRSSUJfUFJJTlRGKGZvcm1hdG5yLGZpcnN0YXJnbnIpICBcCiAgICBfX2F0dHJpYnV0ZV9fKChfX2Zvcm1hdF9fIChwcmludGYsZm9ybWF0bnIsZmlyc3RhcmducikpKQojZW5kaWYKCiNpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPiA2KQojZGVmaW5lIExSWlNaX0FUVFJJQl9VTlVTRUQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCiNlbmRpZgoKI2lmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3KQojIGRlZmluZSBMUlpTWl9BVFRSSUJfUkVHUEFSTShuKSAgXAogICAgX19hdHRyaWJ1dGVfXygoX19yZWdwYXJtX18gKG4pKSkKI2VuZGlmCiNlbmRpZiAvKiBfX0dOVUNfXyAqLwojaWZuZGVmIExSWlNaX0FUVFJJQl9SRUdQQVJNCiNkZWZpbmUgTFJaU1pfQVRUUklCX1JFR1BBUk0obikKI2VuZGlmCiNpZm5kZWYgTFJaU1pfQVRUUklCX1VOVVNFRAojZGVmaW5lIExSWlNaX0FUVFJJQl9VTlVTRUQKI2VuZGlmCiNpZm5kZWYgTFJaU1pfQVRUUklCX05PUkVUCiNkZWZpbmUgTFJaU1pfQVRUUklCX05PUkVUCiNlbmRpZgojaWZuZGVmIExSWlNaX0FUVFJJQl9DT05TVAojZGVmaW5lIExSWlNaX0FUVFJJQl9DT05TVAojZW5kaWYKI2lmbmRlZiBMUlpTWl9BVFRSSUJfUFJJTlRGCiNkZWZpbmUgTFJaU1pfQVRUUklCX1BSSU5URih4LHkpCiNlbmRpZgojaWZuZGVmIExSWlNaX0FUVFJJQl9TRUNUSU9OCiNkZWZpbmUgTFJaU1pfQVRUUklCX1NFQ1RJT04obikKI2VuZGlmCiN1bmRlZiBMUlpTWl9BVFRSSUJfU0VDVElPTgojZGVmaW5lIExSWlNaX0FUVFJJQl9TRUNUSU9OKHgpCiN1bmRlZiBMUlpTWl9BVFRSSUJfUkVHUEFSTQojZGVmaW5lIExSWlNaX0FUVFJJQl9SRUdQQVJNKHgpCgoKI2RlZmluZSBPSyAwCiNkZWZpbmUgRkFMU0UgMAojZGVmaW5lIFRSVUUgMQojZGVmaW5lIEVSUk9SICgtMSkKCi8qIFdhcmQgQ2hyaXN0ZW5zZW4gLyBDUC9NIHBhcmFtZXRlcnMgLSBEb24ndCBjaGFuZ2UgdGhlc2UhICovCiNkZWZpbmUgRU5RIDAwNQojZGVmaW5lIENBTiAoJ1gnJjAzNykKI2RlZmluZSBYT0ZGICgncycmMDM3KQojZGVmaW5lIFhPTiAoJ3EnJjAzNykKI2RlZmluZSBTT0ggMQojZGVmaW5lIFNUWCAyCiNkZWZpbmUgRU9UIDQKI2RlZmluZSBBQ0sgNgojZGVmaW5lIE5BSyAwMjUKI2RlZmluZSBDUE1FT0YgMDMyCiNkZWZpbmUgV0FOVENSQyAwMTAzICAgIC8qIHNlbmQgQyBub3QgTkFLIHRvIGdldCBjcmMgbm90IGNoZWNrc3VtICovCiNkZWZpbmUgV0FOVEcgMDEwNyAgLyogU2VuZCBHIG5vdCBOQUsgdG8gZ2V0IG5vbnN0b3AgYmF0Y2ggeG1zbiAqLwojZGVmaW5lIFRJTUVPVVQgKC0yKQojZGVmaW5lIFJDRE8gKC0zKQojZGVmaW5lIFdDRU9UICgtMTApCgojZGVmaW5lIFJFVFJZTUFYIDEwCgojZGVmaW5lIFVOSVhGSUxFIDB4RjAwMCAgLyogVGhlIFNfSUZNVCBmaWxlIG1hc2sgYml0IGZvciBzdGF0ICovCgojZGVmaW5lIERFRkJZVEwgMjAwMDAwMDAwMEwJLyogZGVmYXVsdCByeCBmaWxlIHNpemUgKi8KCmVudW0gem1fdHlwZV9lbnVtIHsKCVpNX1hNT0RFTSwKCVpNX1lNT0RFTSwKCVpNX1pNT0RFTQp9OwoKc3RydWN0IHptX2ZpbGVpbmZvIHsKCWNoYXIgKmZuYW1lOwoJdGltZV90IG1vZHRpbWU7Cgltb2RlX3QgbW9kZTsKCXNpemVfdCBieXRlc190b3RhbDsKCXNpemVfdCBieXRlc19zZW50OwoJc2l6ZV90IGJ5dGVzX3JlY2VpdmVkOwoJc2l6ZV90IGJ5dGVzX3NraXBwZWQ7IC8qIGNyYXNoIHJlY292ZXJ5ICovCglpbnQgICAgZW9mX3NlZW47Cn07CgojZGVmaW5lIFJfQllURVNMRUZUKHgpICgoeCktPmJ5dGVzX3RvdGFsLSh4KS0+Ynl0ZXNfcmVjZWl2ZWQpCgpleHRlcm4gZW51bSB6bV90eXBlX2VudW0gcHJvdG9jb2w7CgpleHRlcm4gY29uc3QgY2hhciAqcHJvZ3JhbV9uYW1lOyAgICAgICAgLyogdGhlIG5hbWUgYnkgd2hpY2ggd2Ugd2VyZSBjYWxsZWQgKi8KZXh0ZXJuIGludCBWZXJib3NlOwpleHRlcm4gaW50IGVycm9yczsKZXh0ZXJuIGludCBub190aW1lb3V0OwpleHRlcm4gaW50IFpjdGxlc2M7ICAgIC8qIEVuY29kZSBjb250cm9sIGNoYXJhY3RlcnMgKi8KZXh0ZXJuIGludCB1bmRlcl9yc2g7CgpSRVRTSUdUWVBFIGJpYmkgX19QICgoaW50IG4pKTsKCiNkZWZpbmUgc2VuZGxpbmUoYykgcHV0Y2hhcigoYykgJiAwMzc3KQojZGVmaW5lIHhzZW5kbGluZShjKSBwdXRjaGFyKGMpCgovKiB6cmVhZGxpbmUuYyAqLwpleHRlcm4gY2hhciAqcmVhZGxpbmVfcHRyOyAvKiBwb2ludGVyIGZvciByZW1vdmluZyBjaGFycyBmcm9tIGxpbmJ1ZiAqLwpleHRlcm4gaW50IHJlYWRsaW5lX2xlZnQ7IC8qIG51bWJlciBvZiBidWZmZXJlZCBjaGFycyBsZWZ0IHRvIHJlYWQgKi8KI2RlZmluZSBSRUFETElORV9QRih0aW1lb3V0KSBcCiAgICAoLS1yZWFkbGluZV9sZWZ0ID49IDA/ICgqcmVhZGxpbmVfcHRyKysgJiAwMzc3KSA6IHJlYWRsaW5lX2ludGVybmFsKHRpbWVvdXQpKQoKaW50IHJlYWRsaW5lX2ludGVybmFsIF9fUCAoKHVuc2lnbmVkIGludCB0aW1lb3V0KSk7CnZvaWQgcmVhZGxpbmVfcHVyZ2UgX19QICgodm9pZCkpOwp2b2lkIHJlYWRsaW5lX3NldHVwIF9fUCAoKGludCBmZCwgc2l6ZV90IHJlYWRudW0sIAoJc2l6ZV90IGJ1ZmZlcl9zaXplKSkgTFJaU1pfQVRUUklCX1NFQ1RJT04obHJ6c3pfcmFyZSk7CgoKLyogcmJzYi5jICovCmV4dGVybiBpbnQgRnJvbWN1OwpleHRlcm4gaW50IFR3b3N0b3A7CiNpZmRlZiBSRUFEQ0hFQ0tfUkVBRFMKZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY2hlY2tlZDsKI2VuZGlmCmV4dGVybiBpbnQgaW9mZDsKZXh0ZXJuIHVuc2lnbmVkIEJhdWRyYXRlOwoKdm9pZCB6cGVyciBfX1AgKChjb25zdCBjaGFyICpmbXQsIC4uLikpOwp2b2lkIHpwZmF0YWwgX19QICgoY29uc3QgY2hhciAqZm10LCAuLi4pKTsKdm9pZCB2ZmlsZSBfX1AgKChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpOwojZGVmaW5lIHZjaGFyKHgpIHB1dGMoeCxzdGRlcnIpCiNkZWZpbmUgdnN0cmluZyh4KSBmcHV0cyh4LHN0ZGVycikKCiNpZmRlZiBfX0dOVUNfXwojaWYgX19HTlVDX18gPiAxCiNkZWZpbmUgdnN0cmluZ2YoZm9ybWF0LGFyZ3MuLi4pIGZwcmludGYoc3RkZXJyLGZvcm1hdCwgIyNhcmdzKQojZW5kaWYKI2VuZGlmCiNpZm5kZWYgdnN0cmluZ2YKdm9pZCB2c3RyaW5nZiBfX1AgKChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpOwojZW5kaWYKI2RlZmluZSBWUFJJTlRGKGxldmVsLGZvcm1hdF9hcmdzKSBkbyB7aWYgKChWZXJib3NlKT49KGxldmVsKSkgXAoJdnN0cmluZ2YgZm9ybWF0X2FyZ3MgOyB9IHdoaWxlKDApCgovKiByYnNiLmMgKi8KaW50IGZyb21fY3UgX19QICgodm9pZCkpIExSWlNaX0FUVFJJQl9TRUNUSU9OKGxyenN6X3JhcmUpOwppbnQgcmRjaGsgX19QICgoaW50IGZkKSk7CmludCBpb19tb2RlIF9fUCAoKGludCBmZCwgaW50IG4pKSBMUlpTWl9BVFRSSUJfU0VDVElPTihscnpzel9yYXJlKTsKdm9pZCBzZW5kYnJrIF9fUCAoKGludCBmZCkpOwojZGVmaW5lIGZsdXNobW8oKSBmZmx1c2goc3Rkb3V0KQp2b2lkIHB1cmdlbGluZSBfX1AgKChpbnQgZmQpKTsKdm9pZCBjYW5pdCBfX1AgKChpbnQgZmQpKTsKCgovKiBjcmN0YWIuYyAqLwpleHRlcm4gdW5zaWduZWQgc2hvcnQgY3JjdGFiWzI1Nl07CiNkZWZpbmUgdXBkY3JjKGNwLCBjcmMpICggY3JjdGFiWygoY3JjID4+IDgpICYgMjU1KV0gXiAoY3JjIDw8IDgpIF4gY3ApCmV4dGVybiBsb25nIGNyM3RhYltdOwojZGVmaW5lIFVQREMzMihiLCBjKSAoY3IzdGFiWygoaW50KWMgXiBiKSAmIDB4ZmZdIF4gKChjID4+IDgpICYgMHgwMEZGRkZGRikpCgovKiB6bS5jICovCiNpbmNsdWRlICJ6bW9kZW0uaCIKZXh0ZXJuIHVuc2lnbmVkIGludCBSeHRpbWVvdXQ7ICAgICAgICAvKiBUZW50aHMgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBzb21ldGhpbmcgKi8KZXh0ZXJuIGludCBieXRlc19wZXJfZXJyb3I7ICAvKiBnZW5lcmF0ZSBvbmUgZXJyb3IgYXJvdW5kIGV2ZXJ5IHggYnl0ZXMgKi8KCi8qIEdsb2JhbHMgdXNlZCBieSBaTU9ERU0gZnVuY3Rpb25zICovCmV4dGVybiBpbnQgUnhmcmFtZWluZDsgICAgIC8qIFpCSU4gWkJJTjMyLCBvciBaSEVYIHR5cGUgb2YgZnJhbWUgcmVjZWl2ZWQgKi8KZXh0ZXJuIGludCBSeHR5cGU7ICAgICAvKiBUeXBlIG9mIGhlYWRlciByZWNlaXZlZCAqLwpleHRlcm4gaW50IFpyd2luZG93OyAgICAgICAvKiBSWCB3aW5kb3cgc2l6ZSAoY29udHJvbHMgZ2FyYmFnZSBjb3VudCkgKi8KLyogZXh0ZXJuIGludCBSeGNvdW50OyAqLyAgICAgICAvKiBDb3VudCBvZiBkYXRhIGJ5dGVzIHJlY2VpdmVkICovCmV4dGVybiBjaGFyIFJ4aGRyWzRdOyAgICAgIC8qIFJlY2VpdmVkIGhlYWRlciAqLwpleHRlcm4gY2hhciBUeGhkcls0XTsgICAgICAvKiBUcmFuc21pdHRlZCBoZWFkZXIgKi8KZXh0ZXJuIGxvbmcgVHhwb3M7ICAgICAvKiBUcmFuc21pdHRlZCBmaWxlIHBvc2l0aW9uICovCmV4dGVybiBpbnQgVHhmY3MzMjsgICAgICAgIC8qIFRVUkUgbWVhbnMgc2VuZCBiaW5hcnkgZnJhbWVzIHdpdGggMzIgYml0IEZDUyAqLwpleHRlcm4gaW50IENyYzMydDsgICAgIC8qIERpc3BsYXkgZmxhZyBpbmRpY2F0aW5nIDMyIGJpdCBDUkMgYmVpbmcgc2VudCAqLwpleHRlcm4gaW50IENyYzMyOyAgICAgIC8qIERpc3BsYXkgZmxhZyBpbmRpY2F0aW5nIDMyIGJpdCBDUkMgYmVpbmcgcmVjZWl2ZWQgKi8KZXh0ZXJuIGludCBabnVsbHM7ICAgICAvKiBOdW1iZXIgb2YgbnVsbHMgdG8gc2VuZCBhdCBiZWdpbm5pbmcgb2YgWkRBVEEgaGRyICovCmV4dGVybiBjaGFyIEF0dG5bWkFUVE5MRU4rMV07ICAvKiBBdHRlbnRpb24gc3RyaW5nIHJ4IHNlbmRzIHRvIHR4IG9uIGVyciAqLwoKZXh0ZXJuIHZvaWQgenNlbmRsaW5lIF9fUCAoKGludCBjKSk7CmV4dGVybiB2b2lkIHpzZW5kbGluZV9pbml0IF9fUCAoKHZvaWQpKSBMUlpTWl9BVFRSSUJfU0VDVElPTihscnpzel9yYXJlKTsKdm9pZCB6c2JoZHIgX19QICgoaW50IHR5cGUsIGNoYXIgKmhkcikpOwp2b2lkIHpzaGhkciBfX1AgKChpbnQgdHlwZSwgY2hhciAqaGRyKSk7CnZvaWQgenNkYXRhIF9fUCAoKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbmd0aCwgaW50IGZyYW1lZW5kKSk7CnZvaWQgenNkYTMyIF9fUCAoKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbmd0aCwgaW50IGZyYW1lZW5kKSk7CmludCB6cmRhdGEgX19QICgoY2hhciAqYnVmLCBpbnQgbGVuZ3RoLCBzaXplX3QgKnJlY2VpdmVkKSk7CmludCB6Z2V0aGRyIF9fUCAoKGNoYXIgKmhkciwgaW50IGVmbGFnLCBzaXplX3QgKikpOwp2b2lkIHN0b2hkciBfX1AgKChzaXplX3QgcG9zKSkgTFJaU1pfQVRUUklCX1JFR1BBUk0oMSk7CmxvbmcgcmNsaGRyIF9fUCAoKGNoYXIgKmhkcikpIExSWlNaX0FUVFJJQl9SRUdQQVJNKDEpOwoKaW50IHRjcF9zZXJ2ZXIgX19QICgoY2hhciAqYnVmKSkgTFJaU1pfQVRUUklCX1NFQ1RJT04obHJ6c3pfcmFyZSk7CmludCB0Y3BfY29ubmVjdCBfX1AgKChjaGFyICpidWYpKSBMUlpTWl9BVFRSSUJfU0VDVElPTihscnpzel9yYXJlKTsKaW50IHRjcF9hY2NlcHQgX19QICgoaW50IGQpKSBMUlpTWl9BVFRSSUJfU0VDVElPTihscnpzel9yYXJlKTsKCgpjb25zdCBjaGFyICogcHJvdG5hbWUgX19QICgodm9pZCkpIExSWlNaX0FUVFJJQl9TRUNUSU9OKGxyenN6X3JhcmUpOwp2b2lkIGxzeXNsb2cgX19QICgoaW50LCBjb25zdCBjaGFyICosLi4uKSk7CgoKCgojZW5kaWYK