LyoKICoJCVBpeGFydCBQQUM3MzAyIGxpYnJhcnkKICoJCUNvcHlyaWdodCAoQykgMjAwNSBUaG9tYXMgS2Fpc2VyIHRob21hc0BrYWlzZXItbGludXgubGkKICoKICogVjRMMiBieSBKZWFuLUZyYW5jb2lzIE1vaW5lIDxodHRwOi8vbW9pbmVqZi5mcmVlLmZyPgogKgogKiBTZXBhcmF0ZWQgZnJvbSBQaXhhcnQgUEFDNzMxMSBsaWJyYXJ5IGJ5IE3hcnRvbiBO6W1ldGggPG5tMTI3QGZyZWVtYWlsLmh1PgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQogKi8KCi8qIFNvbWUgZG9jdW1lbnRhdGlvbiBhYm91dCB2YXJpb3VzIHJlZ2lzdGVycyBhcyBkZXRlcm1pbmVkIGJ5IHRyaWFsIGFuZCBlcnJvci4KICAgV2hlbiB0aGUgcmVnaXN0ZXIgYWRkcmVzc2VzIGRpZmZlciBiZXR3ZWVuIHRoZSA3MjAyIGFuZCB0aGUgNzMxMSB0aGUgMgogICBkaWZmZXJlbnQgYWRkcmVzc2VzIGFyZSB3cml0dGVuIGFzIDczMDJhZGRyLzczMTFhZGRyLCB3aGVuIG9uZSBvZiB0aGUgMgogICBhZGRyZXNzZXMgaXMgYSAtIHNpZ24gdGhhdCByZWdpc3RlciBkZXNjcmlwdGlvbiBpcyBub3QgdmFsaWQgZm9yIHRoZQogICBtYXRjaGluZyBJQy4KCiAgIFJlZ2lzdGVyIHBhZ2UgMToKCiAgIEFkZHJlc3MJRGVzY3JpcHRpb24KICAgLS8weDA4CVVua25vd24gY29tcHJlc3NvciByZWxhdGVkLCBtdXN0IGFsd2F5cyBiZSA4IGV4Y2VwdCB3aGVuIG5vdAoJCWluIDY0MHg0ODAgcmVzb2x1dGlvbiBhbmQgcGFnZSA0IHJlZyAyIDw9IDMgdGhlbiBzZXQgaXQgdG8gOSAhCiAgIC0vMHgxYglBdXRvIHdoaXRlIGJhbGFuY2UgcmVsYXRlZCwgYml0IDAgaXMgQVdCIGVuYWJsZSAoaW52ZXJ0ZWQpCgkJYml0cyAzNDUgc2VlbSB0byB0b2dnbGUgcGVyIGNvbG9yIGdhaW5zIG9uL29mZiAoaW52ZXJ0ZWQpCiAgIDB4NzgJCUdsb2JhbCBjb250cm9sLCBiaXQgNiBjb250cm9scyB0aGUgTEVEIChpbnZlcnRlZCkKICAgLS8weDgwCUpQRUcgY29tcHJlc3Npb24gcmF0aW8gPyBCZXN0IG5vdCB0b3VjaGVkCgogICBSZWdpc3RlciBwYWdlIDMvNDoKCiAgIEFkZHJlc3MJRGVzY3JpcHRpb24KICAgMHgwMgkJQ2xvY2sgZGl2aWRlciAyLTYzLCBmcHMgPX4gNjAgLyB2YWwuIE11c3QgYmUgYSBtdWx0aXBsZSBvZiAzIG9uCgkJdGhlIDczMDIsIHNvIG9uZSBvZiAzLCA2LCA5LCAuLi4sIGV4Y2VwdCB3aGVuIGJldHdlZW4gNiBhbmQgMTI/CiAgIC0vMHgwZglNYXN0ZXIgZ2FpbiAxLTI0NSwgbG93IHZhbHVlID0gaGlnaCBnYWluCiAgIDB4MTAvLQlNYXN0ZXIgZ2FpbiAwLTMxCiAgIC0vMHgxMAlBbm90aGVyIGdhaW4gMC0xNSwgbGltaXRlZCBpbmZsdWVuY2UgKDEtMnggZ2FpbiBJIGd1ZXNzKQogICAweDIxCQlCaXRmaWVsZDogMC0xIHVudXNlZCwgMi0zIHZmbGlwL2hmbGlwLCA0LTUgdW5rbm93biwgNi03IHVudXNlZAogICAtLzB4MjcJU2VlbXMgdG8gdG9nZ2xlIHZhcmlvdXMgZ2FpbnMgb24gLyBvZmYsIFNldHRpbmcgYml0IDcgc2VlbXMgdG8KCQljb21wbGV0ZWx5IGRpc2FibGUgdGhlIGFuYWxvZyBhbXBsaWZpY2F0aW9uIGJsb2NrLiBTZXQgdG8gMHg2OAoJCWZvciBtYXggZ2FpbiwgMHgxNCBmb3IgbWluaW1hbCBnYWluLgoKICAgVGhlIHJlZ2lzdGVycyBhcmUgYWNjZXNzZWQgaW4gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CgogICBQYWdlIHwgUmVnaXN0ZXIgICB8IEZ1bmN0aW9uCiAgIC0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIDAgICB8IDB4MGYuLjB4MjAgfCBzZXRjb2xvcnMoKQogICAgMCAgIHwgMHhhMi4uMHhhYiB8IHNldGJyaWdodGNvbnQoKQogICAgMCAgIHwgMHhjNSAgICAgICB8IHNldHJlZGJhbGFuY2UoKQogICAgMCAgIHwgMHhjNiAgICAgICB8IHNldHdoaXRlYmFsYW5jZSgpCiAgICAwICAgfCAweGM3ICAgICAgIHwgc2V0Ymx1ZWJhbGFuY2UoKQogICAgMCAgIHwgMHhkYyAgICAgICB8IHNldGJyaWdodGNvbnQoKSwgc2V0Y29sb3JzKCkKICAgIDMgICB8IDB4MDIgICAgICAgfCBzZXRleHBvc3VyZSgpCiAgICAzICAgfCAweDEwICAgICAgIHwgc2V0Z2FpbigpCiAgICAzICAgfCAweDExICAgICAgIHwgc2V0Y29sb3JzKCksIHNldGdhaW4oKSwgc2V0ZXhwb3N1cmUoKSwgc2V0aHZmbGlwKCkKICAgIDMgICB8IDB4MjEgICAgICAgfCBzZXRodmZsaXAoKQoqLwoKI2RlZmluZSBNT0RVTEVfTkFNRSAicGFjNzMwMiIKCiNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KI2luY2x1ZGUgImdzcGNhLmgiCgpNT0RVTEVfQVVUSE9SKCJUaG9tYXMgS2Fpc2VyIHRob21hc0BrYWlzZXItbGludXgubGkiKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJQaXhhcnQgUEFDNzMwMiIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgovKiBzcGVjaWZpYyB3ZWJjYW0gZGVzY3JpcHRvciBmb3IgcGFjNzMwMiAqLwpzdHJ1Y3Qgc2QgewoJc3RydWN0IGdzcGNhX2RldiBnc3BjYV9kZXY7CQkvKiAhISBtdXN0IGJlIHRoZSBmaXJzdCBpdGVtICovCgoJdW5zaWduZWQgY2hhciBicmlnaHRuZXNzOwoJdW5zaWduZWQgY2hhciBjb250cmFzdDsKCXVuc2lnbmVkIGNoYXIgY29sb3JzOwoJdW5zaWduZWQgY2hhciB3aGl0ZV9iYWxhbmNlOwoJdW5zaWduZWQgY2hhciByZWRfYmFsYW5jZTsKCXVuc2lnbmVkIGNoYXIgYmx1ZV9iYWxhbmNlOwoJdW5zaWduZWQgY2hhciBnYWluOwoJdW5zaWduZWQgY2hhciBleHBvc3VyZTsKCXVuc2lnbmVkIGNoYXIgYXV0b2dhaW47CglfX3U4IGhmbGlwOwoJX191OCB2ZmxpcDsKCXU4IGZsYWdzOwojZGVmaW5lIEZMX0hGTElQIDB4MDEJCS8qIG1pcnJvcmVkIGJ5IGRlZmF1bHQgKi8KI2RlZmluZSBGTF9WRkxJUCAweDAyCQkvKiB2ZXJ0aWNhbCBmbGlwcGVkIGJ5IGRlZmF1bHQgKi8KCgl1OCBzb2ZfcmVhZDsKCXU4IGF1dG9nYWluX2lnbm9yZV9mcmFtZXM7CgoJYXRvbWljX3QgYXZnX2x1bTsKfTsKCi8qIFY0TDIgY29udHJvbHMgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIgKi8Kc3RhdGljIGludCBzZF9zZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKc3RhdGljIGludCBzZF9nZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CnN0YXRpYyBpbnQgc2Rfc2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwpzdGF0aWMgaW50IHNkX2dldGNvbnRyYXN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CnN0YXRpYyBpbnQgc2Rfc2V0Y29sb3JzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKc3RhdGljIGludCBzZF9nZXRjb2xvcnMoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKc3RhdGljIGludCBzZF9zZXR3aGl0ZWJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwpzdGF0aWMgaW50IHNkX2dldHdoaXRlYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpOwpzdGF0aWMgaW50IHNkX3NldHJlZGJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwpzdGF0aWMgaW50IHNkX2dldHJlZGJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKc3RhdGljIGludCBzZF9zZXRibHVlYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CnN0YXRpYyBpbnQgc2RfZ2V0Ymx1ZWJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKc3RhdGljIGludCBzZF9zZXRhdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CnN0YXRpYyBpbnQgc2RfZ2V0YXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKc3RhdGljIGludCBzZF9zZXRoZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CnN0YXRpYyBpbnQgc2RfZ2V0aGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKc3RhdGljIGludCBzZF9zZXR2ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCk7CnN0YXRpYyBpbnQgc2RfZ2V0dmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKTsKc3RhdGljIGludCBzZF9zZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKTsKc3RhdGljIGludCBzZF9nZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CnN0YXRpYyBpbnQgc2Rfc2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpOwpzdGF0aWMgaW50IHNkX2dldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCk7CgpzdGF0aWMgc3RydWN0IGN0cmwgc2RfY3RybHNbXSA9IHsKLyogVGhpcyBjb250cm9sIGlzIHBhYzczMDIgb25seSAqLwoJewoJICAgIHsKCQkuaWQgICAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCgkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAoJCS5uYW1lICAgID0gIkJyaWdodG5lc3MiLAoJCS5taW5pbXVtID0gMCwKI2RlZmluZSBCUklHSFRORVNTX01BWCAweDIwCgkJLm1heGltdW0gPSBCUklHSFRORVNTX01BWCwKCQkuc3RlcCAgICA9IDEsCiNkZWZpbmUgQlJJR0hUTkVTU19ERUYgMHgxMAoJCS5kZWZhdWx0X3ZhbHVlID0gQlJJR0hUTkVTU19ERUYsCgkgICAgfSwKCSAgICAuc2V0ID0gc2Rfc2V0YnJpZ2h0bmVzcywKCSAgICAuZ2V0ID0gc2RfZ2V0YnJpZ2h0bmVzcywKCX0sCi8qIFRoaXMgY29udHJvbCBpcyBmb3IgYm90aCB0aGUgNzMwMiBhbmQgdGhlIDczMTEgKi8KCXsKCSAgICB7CgkJLmlkICAgICAgPSBWNEwyX0NJRF9DT05UUkFTVCwKCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCgkJLm5hbWUgICAgPSAiQ29udHJhc3QiLAoJCS5taW5pbXVtID0gMCwKI2RlZmluZSBDT05UUkFTVF9NQVggMjU1CgkJLm1heGltdW0gPSBDT05UUkFTVF9NQVgsCgkJLnN0ZXAgICAgPSAxLAojZGVmaW5lIENPTlRSQVNUX0RFRiAxMjcKCQkuZGVmYXVsdF92YWx1ZSA9IENPTlRSQVNUX0RFRiwKCSAgICB9LAoJICAgIC5zZXQgPSBzZF9zZXRjb250cmFzdCwKCSAgICAuZ2V0ID0gc2RfZ2V0Y29udHJhc3QsCgl9LAovKiBUaGlzIGNvbnRyb2wgaXMgcGFjNzMwMiBvbmx5ICovCgl7CgkgICAgewoJCS5pZCAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCgkJLm5hbWUgICAgPSAiU2F0dXJhdGlvbiIsCgkJLm1pbmltdW0gPSAwLAojZGVmaW5lIENPTE9SX01BWCAyNTUKCQkubWF4aW11bSA9IENPTE9SX01BWCwKCQkuc3RlcCAgICA9IDEsCiNkZWZpbmUgQ09MT1JfREVGIDEyNwoJCS5kZWZhdWx0X3ZhbHVlID0gQ09MT1JfREVGLAoJICAgIH0sCgkgICAgLnNldCA9IHNkX3NldGNvbG9ycywKCSAgICAuZ2V0ID0gc2RfZ2V0Y29sb3JzLAoJfSwKCXsKCSAgICB7CgkJLmlkICAgICAgPSBWNEwyX0NJRF9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFLAoJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKCQkubmFtZSAgICA9ICJXaGl0ZSBCYWxhbmNlIiwKCQkubWluaW11bSA9IDAsCgkJLm1heGltdW0gPSAyNTUsCgkJLnN0ZXAgICAgPSAxLAojZGVmaW5lIFdISVRFQkFMQU5DRV9ERUYgNAoJCS5kZWZhdWx0X3ZhbHVlID0gV0hJVEVCQUxBTkNFX0RFRiwKCSAgICB9LAoJICAgIC5zZXQgPSBzZF9zZXR3aGl0ZWJhbGFuY2UsCgkgICAgLmdldCA9IHNkX2dldHdoaXRlYmFsYW5jZSwKCX0sCgl7CgkgICAgewoJCS5pZCAgICAgID0gVjRMMl9DSURfUkVEX0JBTEFOQ0UsCgkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAoJCS5uYW1lICAgID0gIlJlZCIsCgkJLm1pbmltdW0gPSAwLAoJCS5tYXhpbXVtID0gMywKCQkuc3RlcCAgICA9IDEsCiNkZWZpbmUgUkVEQkFMQU5DRV9ERUYgMQoJCS5kZWZhdWx0X3ZhbHVlID0gUkVEQkFMQU5DRV9ERUYsCgkgICAgfSwKCSAgICAuc2V0ID0gc2Rfc2V0cmVkYmFsYW5jZSwKCSAgICAuZ2V0ID0gc2RfZ2V0cmVkYmFsYW5jZSwKCX0sCgl7CgkgICAgewoJCS5pZCAgICAgID0gVjRMMl9DSURfQkxVRV9CQUxBTkNFLAoJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKCQkubmFtZSAgICA9ICJCbHVlIiwKCQkubWluaW11bSA9IDAsCgkJLm1heGltdW0gPSAzLAoJCS5zdGVwICAgID0gMSwKI2RlZmluZSBCTFVFQkFMQU5DRV9ERUYgMQoJCS5kZWZhdWx0X3ZhbHVlID0gQkxVRUJBTEFOQ0VfREVGLAoJICAgIH0sCgkgICAgLnNldCA9IHNkX3NldGJsdWViYWxhbmNlLAoJICAgIC5nZXQgPSBzZF9nZXRibHVlYmFsYW5jZSwKCX0sCi8qIEFsbCBjb250cm9scyBiZWxvdyBhcmUgZm9yIGJvdGggdGhlIDczMDIgYW5kIHRoZSA3MzExICovCgl7CgkgICAgewoJCS5pZCAgICAgID0gVjRMMl9DSURfR0FJTiwKCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCgkJLm5hbWUgICAgPSAiR2FpbiIsCgkJLm1pbmltdW0gPSAwLAojZGVmaW5lIEdBSU5fTUFYIDI1NQoJCS5tYXhpbXVtID0gR0FJTl9NQVgsCgkJLnN0ZXAgICAgPSAxLAojZGVmaW5lIEdBSU5fREVGIDEyNwojZGVmaW5lIEdBSU5fS05FRSAyNTUgLyogR2FpbiBzZWVtcyB0byBjYXVzZSBsaXR0bGUgbm9pc2Ugb24gdGhlIHBhYzczeHggKi8KCQkuZGVmYXVsdF92YWx1ZSA9IEdBSU5fREVGLAoJICAgIH0sCgkgICAgLnNldCA9IHNkX3NldGdhaW4sCgkgICAgLmdldCA9IHNkX2dldGdhaW4sCgl9LAoJewoJICAgIHsKCQkuaWQgICAgICA9IFY0TDJfQ0lEX0VYUE9TVVJFLAoJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKCQkubmFtZSAgICA9ICJFeHBvc3VyZSIsCgkJLm1pbmltdW0gPSAwLAojZGVmaW5lIEVYUE9TVVJFX01BWCAyNTUKCQkubWF4aW11bSA9IEVYUE9TVVJFX01BWCwKCQkuc3RlcCAgICA9IDEsCiNkZWZpbmUgRVhQT1NVUkVfREVGICAxNiAvKiAgMzIgbXMgLyAzMCBmcHMgKi8KI2RlZmluZSBFWFBPU1VSRV9LTkVFIDUwIC8qIDEwMCBtcyAvIDEwIGZwcyAqLwoJCS5kZWZhdWx0X3ZhbHVlID0gRVhQT1NVUkVfREVGLAoJICAgIH0sCgkgICAgLnNldCA9IHNkX3NldGV4cG9zdXJlLAoJICAgIC5nZXQgPSBzZF9nZXRleHBvc3VyZSwKCX0sCgl7CgkgICAgewoJCS5pZCAgICAgID0gVjRMMl9DSURfQVVUT0dBSU4sCgkJLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAoJCS5uYW1lICAgID0gIkF1dG8gR2FpbiIsCgkJLm1pbmltdW0gPSAwLAoJCS5tYXhpbXVtID0gMSwKCQkuc3RlcCAgICA9IDEsCiNkZWZpbmUgQVVUT0dBSU5fREVGIDEKCQkuZGVmYXVsdF92YWx1ZSA9IEFVVE9HQUlOX0RFRiwKCSAgICB9LAoJICAgIC5zZXQgPSBzZF9zZXRhdXRvZ2FpbiwKCSAgICAuZ2V0ID0gc2RfZ2V0YXV0b2dhaW4sCgl9LAoJewoJICAgIHsKCQkuaWQgICAgICA9IFY0TDJfQ0lEX0hGTElQLAoJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKCQkubmFtZSAgICA9ICJNaXJyb3IiLAoJCS5taW5pbXVtID0gMCwKCQkubWF4aW11bSA9IDEsCgkJLnN0ZXAgICAgPSAxLAojZGVmaW5lIEhGTElQX0RFRiAwCgkJLmRlZmF1bHRfdmFsdWUgPSBIRkxJUF9ERUYsCgkgICAgfSwKCSAgICAuc2V0ID0gc2Rfc2V0aGZsaXAsCgkgICAgLmdldCA9IHNkX2dldGhmbGlwLAoJfSwKCXsKCSAgICB7CgkJLmlkICAgICAgPSBWNEwyX0NJRF9WRkxJUCwKCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCgkJLm5hbWUgICAgPSAiVmZsaXAiLAoJCS5taW5pbXVtID0gMCwKCQkubWF4aW11bSA9IDEsCgkJLnN0ZXAgICAgPSAxLAojZGVmaW5lIFZGTElQX0RFRiAwCgkJLmRlZmF1bHRfdmFsdWUgPSBWRkxJUF9ERUYsCgkgICAgfSwKCSAgICAuc2V0ID0gc2Rfc2V0dmZsaXAsCgkgICAgLmdldCA9IHNkX2dldHZmbGlwLAoJfSwKfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHZnYV9tb2RlW10gPSB7Cgl7NjQwLCA0ODAsIFY0TDJfUElYX0ZNVF9QSlBHLCBWNEwyX0ZJRUxEX05PTkUsCgkJLmJ5dGVzcGVybGluZSA9IDY0MCwKCQkuc2l6ZWltYWdlID0gNjQwICogNDgwICogMyAvIDggKyA1OTAsCgkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRywKCQkucHJpdiA9IDB9LAp9OwoKI2RlZmluZSBMT0FEX1BBR0UzCQkyNTUKI2RlZmluZSBMT0FEX1BBR0U0CQkyNTQKI2RlZmluZSBFTkRfT0ZfU0VRVUVOQ0UJCTAKCi8qIHBhYyA3MzAyICovCnN0YXRpYyBjb25zdCBfX3U4IGluaXRfNzMwMltdID0gewovKglpbmRleCx2YWx1ZSAqLwoJMHhmZiwgMHgwMSwJCS8qIHBhZ2UgMSAqLwoJMHg3OCwgMHgwMCwJCS8qIGRlYWN0aXZhdGUgKi8KCTB4ZmYsIDB4MDEsCgkweDc4LCAweDQwLAkJLyogbGVkIG9mZiAqLwp9OwpzdGF0aWMgY29uc3QgX191OCBzdGFydF83MzAyW10gPSB7Ci8qCWluZGV4LCBsZW4sIFt2YWx1ZV0qICovCgkweGZmLCAxLAkweDAwLAkJLyogcGFnZSAwICovCgkweDAwLCAxMiwJMHgwMSwgMHg0MCwgMHg0MCwgMHg0MCwgMHgwMSwgMHhlMCwgMHgwMiwgMHg4MCwKCQkJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MGQsIDI0LAkweDAzLCAweDAxLCAweDAwLCAweGI1LCAweDA3LCAweGNiLCAweDAwLCAweDAwLAoJCQkweDA3LCAweGM4LCAweDAwLCAweGVhLCAweDA3LCAweGNmLCAweDA3LCAweGY3LAoJCQkweDA3LCAweDdlLCAweDAxLCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweDExLAoJMHgyNiwgMiwJMHhhYSwgMHhhYSwKCTB4MmUsIDEsCTB4MzEsCgkweDM4LCAxLAkweDAxLAoJMHgzYSwgMywJMHgxNCwgMHhmZiwgMHg1YSwKCTB4NDMsIDExLAkweDAwLCAweDBhLCAweDE4LCAweDExLCAweDAxLCAweDJjLCAweDg4LCAweDExLAoJCQkweDAwLCAweDU0LCAweDExLAoJMHg1NSwgMSwJMHgwMCwKCTB4NjIsIDQsIAkweDEwLCAweDFlLCAweDFlLCAweDE4LAoJMHg2YiwgMSwJMHgwMCwKCTB4NmUsIDMsCTB4MDgsIDB4MDYsIDB4MDAsCgkweDcyLCAzLAkweDAwLCAweGZmLCAweDAwLAoJMHg3ZCwgMjMsCTB4MDEsIDB4MDEsIDB4NTgsIDB4NDYsIDB4NTAsIDB4M2MsIDB4NTAsIDB4M2MsCgkJCTB4NTQsIDB4NDYsIDB4NTQsIDB4NTYsIDB4NTIsIDB4NTAsIDB4NTIsIDB4NTAsCgkJCTB4NTYsIDB4NjQsIDB4YTQsIDB4MDAsIDB4ZGEsIDB4MDAsIDB4MDAsCgkweGEyLCAxMCwJMHgyMiwgMHgyYywgMHgzYywgMHg1NCwgMHg2OSwgMHg3YywgMHg5YywgMHhiOSwKCQkJMHhkMiwgMHhlYiwKCTB4YWYsIDEsCTB4MDIsCgkweGI1LCAyLAkweDA4LCAweDA4LAoJMHhiOCwgMiwJMHgwOCwgMHg4OCwKCTB4YzQsIDQsCTB4YWUsIDB4MDEsIDB4MDQsIDB4MDEsCgkweGNjLCAxLAkweDAwLAoJMHhkMSwgMTEsCTB4MDEsIDB4MzAsIDB4NDksIDB4NWUsIDB4NmYsIDB4N2YsIDB4OGUsIDB4YTksCgkJCTB4YzEsIDB4ZDcsIDB4ZWMsCgkweGRjLCAxLAkweDAxLAoJMHhmZiwgMSwJMHgwMSwJCS8qIHBhZ2UgMSAqLwoJMHgxMiwgMywJMHgwMiwgMHgwMCwgMHgwMSwKCTB4M2UsIDIsCTB4MDAsIDB4MDAsCgkweDc2LCA1LAkweDAxLCAweDIwLCAweDQwLCAweDAwLCAweGYyLAoJMHg3YywgMSwJMHgwMCwKCTB4N2YsIDEwLAkweDRiLCAweDBmLCAweDAxLCAweDJjLCAweDAyLCAweDU4LCAweDAzLCAweDIwLAoJCQkweDAyLCAweDAwLAoJMHg5NiwgNSwJMHgwMSwgMHgxMCwgMHgwNCwgMHgwMSwgMHgwNCwKCTB4YzgsIDE0LAkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLAoJCQkweDA3LCAweDAwLCAweDAxLCAweDA3LCAweDA0LCAweDAxLAoJMHhkOCwgMSwJMHgwMSwKCTB4ZGIsIDIsCTB4MDAsIDB4MDEsCgkweGRlLCA3LAkweDAwLCAweDAxLCAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLAoJMHhlNiwgNCwJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKCTB4ZWIsIDEsCTB4MDAsCgkweGZmLCAxLAkweDAyLAkJLyogcGFnZSAyICovCgkweDIyLCAxLAkweDAwLAoJMHhmZiwgMSwJMHgwMywJCS8qIHBhZ2UgMyAqLwoJMCwgTE9BRF9QQUdFMywJCQkvKiBsb2FkIHRoZSBwYWdlIDMgKi8KCTB4MTEsIDEsCTB4MDEsCgkweGZmLCAxLAkweDAyLAkJLyogcGFnZSAyICovCgkweDEzLCAxLAkweDAwLAoJMHgyMiwgNCwJMHgxZiwgMHhhNCwgMHhmMCwgMHg5NiwKCTB4MjcsIDIsCTB4MTQsIDB4MGMsCgkweDJhLCA1LAkweGM4LCAweDAwLCAweDE4LCAweDEyLCAweDIyLAoJMHg2NCwgOCwJMHgwMCwgMHgwMCwgMHhmMCwgMHgwMSwgMHgxNCwgMHg0NCwgMHg0NCwgMHg0NCwKCTB4NmUsIDEsCTB4MDgsCgkweGZmLCAxLAkweDAxLAkJLyogcGFnZSAxICovCgkweDc4LCAxLAkweDAwLAoJMCwgRU5EX09GX1NFUVVFTkNFCQkvKiBlbmQgb2Ygc2VxdWVuY2UgKi8KfTsKCiNkZWZpbmUgU0tJUAkJMHhhYQovKiBwYWdlIDMgLSB0aGUgdmFsdWUgU0tJUCBzYXlzIHNraXAgdGhlIGluZGV4IC0gc2VlIHJlZ193X3BhZ2UoKSAqLwpzdGF0aWMgY29uc3QgX191OCBwYWdlM183MzAyW10gPSB7CgkweDkwLCAweDQwLCAweDAzLCAweDUwLCAweGMyLCAweDAxLCAweDE0LCAweDE2LAoJMHgxNCwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgzMywgMHgwMCwKCTB4MGYsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDAxLCAweGIzLCAweDAxLCAweDAwLAoJMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwMCwgMHgwMCwgMHgyMSwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4NTQsIDB4ZjQsIDB4MDIsIDB4NTIsIDB4NTQsCgkweGE0LCAweGI4LCAweGUwLCAweDJhLCAweGY2LCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgxZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4ZmMsIDB4MDAsIDB4ZjIsIDB4MWYsIDB4MDQsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweGMwLCAweGMwLCAweDEwLCAweDAwLCAweDAwLAoJMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4NDAsIDB4ZmYsIDB4MDMsIDB4MTksIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjOCwgMHhjOCwgMHhjOCwKCTB4YzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTAsCgkweDA4LCAweDEwLCAweDI0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAoJMHgwMSwgMHgwMCwgMHgwMiwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCgkweDAwLCAweDAyLCAweGZhLCAweDAwLCAweDY0LCAweDVhLCAweDI4LCAweDAwLAoJMHgwMAp9OwoKc3RhdGljIGludCByZWdfd19idWYoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAoJCSAgX191OCBpbmRleCwKCQkgIGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IGxlbikKewoJaW50IHJldDsKCgltZW1jcHkoZ3NwY2FfZGV2LT51c2JfYnVmLCBidWZmZXIsIGxlbik7CglyZXQgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCgkJCXVzYl9zbmRjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCgkJCTEsCQkvKiByZXF1ZXN0ICovCgkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKCQkJMCwJCS8qIHZhbHVlICovCgkJCWluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIGxlbiwKCQkJNTAwKTsKCWlmIChyZXQgPCAwKQoJCVBERUJVRyhEX0VSUiwgInJlZ193X2J1ZigpOiAiCgkJIkZhaWxlZCB0byB3cml0ZSByZWdpc3RlcnMgdG8gaW5kZXggMHgleCwgZXJyb3IgJWkiLAoJCWluZGV4LCByZXQpOwoJcmV0dXJuIHJldDsKfQoKCnN0YXRpYyBpbnQgcmVnX3coc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAoJCSAgX191OCBpbmRleCwKCQkgIF9fdTggdmFsdWUpCnsKCWludCByZXQ7CgoJZ3NwY2FfZGV2LT51c2JfYnVmWzBdID0gdmFsdWU7CglyZXQgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCgkJCXVzYl9zbmRjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCgkJCTAsCQkJLyogcmVxdWVzdCAqLwoJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCgkJCTAsIGluZGV4LCBnc3BjYV9kZXYtPnVzYl9idWYsIDEsCgkJCTUwMCk7CglpZiAocmV0IDwgMCkKCQlQREVCVUcoRF9FUlIsICJyZWdfdygpOiAiCgkJIkZhaWxlZCB0byB3cml0ZSByZWdpc3RlciB0byBpbmRleCAweCV4LCB2YWx1ZSAweCV4LCBlcnJvciAlaSIsCgkJaW5kZXgsIHZhbHVlLCByZXQpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCByZWdfd19zZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAoJCWNvbnN0IF9fdTggKnNlcSwgaW50IGxlbikKewoJaW50IHJldCA9IDA7Cgl3aGlsZSAoLS1sZW4gPj0gMCkgewoJCWlmICgwIDw9IHJldCkKCQkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCBzZXFbMF0sIHNlcVsxXSk7CgkJc2VxICs9IDI7Cgl9CglyZXR1cm4gcmV0Owp9CgovKiBsb2FkIHRoZSBiZWdpbm5pbmcgb2YgYSBwYWdlICovCnN0YXRpYyBpbnQgcmVnX3dfcGFnZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCgkJCWNvbnN0IF9fdTggKnBhZ2UsIGludCBsZW4pCnsKCWludCBpbmRleDsKCWludCByZXQgPSAwOwoKCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGxlbjsgaW5kZXgrKykgewoJCWlmIChwYWdlW2luZGV4XSA9PSBTS0lQKQkJLyogc2tpcCB0aGlzIGluZGV4ICovCgkJCWNvbnRpbnVlOwoJCWdzcGNhX2Rldi0+dXNiX2J1ZlswXSA9IHBhZ2VbaW5kZXhdOwoJCXJldCA9IHVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKCQkJCXVzYl9zbmRjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCgkJCQkwLAkJCS8qIHJlcXVlc3QgKi8KCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAoJCQkJMCwgaW5kZXgsIGdzcGNhX2Rldi0+dXNiX2J1ZiwgMSwKCQkJCTUwMCk7CgkJaWYgKHJldCA8IDApIHsKCQkJUERFQlVHKERfRVJSLCAicmVnX3dfcGFnZSgpOiAiCgkJCSJGYWlsZWQgdG8gd3JpdGUgcmVnaXN0ZXIgdG8gaW5kZXggMHgleCwgIgoJCQkidmFsdWUgMHgleCwgZXJyb3IgJWkiLAoJCQlpbmRleCwgcGFnZVtpbmRleF0sIHJldCk7CgkJCWJyZWFrOwoJCX0KCX0KCXJldHVybiByZXQ7Cn0KCi8qIG91dHB1dCBhIHZhcmlhYmxlIHNlcXVlbmNlICovCnN0YXRpYyBpbnQgcmVnX3dfdmFyKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKCQkJY29uc3QgX191OCAqc2VxLAoJCQljb25zdCBfX3U4ICpwYWdlMywgdW5zaWduZWQgaW50IHBhZ2UzX2xlbiwKCQkJY29uc3QgX191OCAqcGFnZTQsIHVuc2lnbmVkIGludCBwYWdlNF9sZW4pCnsKCWludCBpbmRleCwgbGVuOwoJaW50IHJldCA9IDA7CgoJZm9yICg7OykgewoJCWluZGV4ID0gKnNlcSsrOwoJCWxlbiA9ICpzZXErKzsKCQlzd2l0Y2ggKGxlbikgewoJCWNhc2UgRU5EX09GX1NFUVVFTkNFOgoJCQlyZXR1cm4gcmV0OwoJCWNhc2UgTE9BRF9QQUdFNDoKCQkJcmV0ID0gcmVnX3dfcGFnZShnc3BjYV9kZXYsIHBhZ2U0LCBwYWdlNF9sZW4pOwoJCQlicmVhazsKCQljYXNlIExPQURfUEFHRTM6CgkJCXJldCA9IHJlZ193X3BhZ2UoZ3NwY2FfZGV2LCBwYWdlMywgcGFnZTNfbGVuKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJaWYgKGxlbiA+IFVTQl9CVUZfU1opIHsKCQkJCVBERUJVRyhEX0VSUnxEX1NUUkVBTSwKCQkJCQkiSW5jb3JyZWN0IHZhcmlhYmxlIHNlcXVlbmNlIik7CgkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJfQoJCQl3aGlsZSAobGVuID4gMCkgewoJCQkJaWYgKGxlbiA8IDgpIHsKCQkJCQlyZXQgPSByZWdfd19idWYoZ3NwY2FfZGV2LAoJCQkJCQlpbmRleCwgc2VxLCBsZW4pOwoJCQkJCWlmIChyZXQgPCAwKQoJCQkJCQlyZXR1cm4gcmV0OwoJCQkJCXNlcSArPSBsZW47CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQlyZXQgPSByZWdfd19idWYoZ3NwY2FfZGV2LCBpbmRleCwgc2VxLCA4KTsKCQkJCXNlcSArPSA4OwoJCQkJaW5kZXggKz0gODsKCQkJCWxlbiAtPSA4OwoJCQl9CgkJfQoJCWlmIChyZXQgPCAwKQoJCQlyZXR1cm4gcmV0OwoJfQoJLyogbm90IHJlYWNoZWQgKi8KfQoKLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgdGltZSBmb3IgcGFjNzMwMiAqLwpzdGF0aWMgaW50IHNkX2NvbmZpZyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsCgkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKewoJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwoJc3RydWN0IGNhbSAqY2FtOwoKCWNhbSA9ICZnc3BjYV9kZXYtPmNhbTsKCglQREVCVUcoRF9DT05GLCAiRmluZCBTZW5zb3IgUEFDNzMwMiIpOwoJY2FtLT5jYW1fbW9kZSA9IHZnYV9tb2RlOwkvKiBvbmx5IDY0MHg0ODAgKi8KCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRSh2Z2FfbW9kZSk7CgoJc2QtPmJyaWdodG5lc3MgPSBCUklHSFRORVNTX0RFRjsKCXNkLT5jb250cmFzdCA9IENPTlRSQVNUX0RFRjsKCXNkLT5jb2xvcnMgPSBDT0xPUl9ERUY7CglzZC0+d2hpdGVfYmFsYW5jZSA9IFdISVRFQkFMQU5DRV9ERUY7CglzZC0+cmVkX2JhbGFuY2UgPSBSRURCQUxBTkNFX0RFRjsKCXNkLT5ibHVlX2JhbGFuY2UgPSBCTFVFQkFMQU5DRV9ERUY7CglzZC0+Z2FpbiA9IEdBSU5fREVGOwoJc2QtPmV4cG9zdXJlID0gRVhQT1NVUkVfREVGOwoJc2QtPmF1dG9nYWluID0gQVVUT0dBSU5fREVGOwoJc2QtPmhmbGlwID0gSEZMSVBfREVGOwoJc2QtPnZmbGlwID0gVkZMSVBfREVGOwoJc2QtPmZsYWdzID0gaWQtPmRyaXZlcl9pbmZvOwoJcmV0dXJuIDA7Cn0KCi8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBwYWM3MzAyIG9ubHkgKi8Kc3RhdGljIGludCBzZXRicmlnaHRjb250KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKewoJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwoJaW50IGksIHY7CglpbnQgcmV0OwoJc3RhdGljIGNvbnN0IF9fdTggbWF4WzEwXSA9CgkJezB4MjksIDB4MzMsIDB4NDIsIDB4NWEsIDB4NmUsIDB4ODAsIDB4OWYsIDB4YmIsCgkJIDB4ZDQsIDB4ZWN9OwoJc3RhdGljIGNvbnN0IF9fdTggZGVsdGFbMTBdID0KCQl7MHgzNSwgMHgzMywgMHgzMywgMHgyZiwgMHgyYSwgMHgyNSwgMHgxZSwgMHgxNywKCQkgMHgxMSwgMHgwYn07CgoJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDAwKTsJLyogcGFnZSAwICovCglmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewoJCXYgPSBtYXhbaV07CgkJdiArPSAoc2QtPmJyaWdodG5lc3MgLSBCUklHSFRORVNTX01BWCkKCQkJKiAxNTAgLyBCUklHSFRORVNTX01BWDsJCS8qIDIwMCA/ICovCgkJdiAtPSBkZWx0YVtpXSAqIHNkLT5jb250cmFzdCAvIENPTlRSQVNUX01BWDsKCQlpZiAodiA8IDApCgkJCXYgPSAwOwoJCWVsc2UgaWYgKHYgPiAweGZmKQoJCQl2ID0gMHhmZjsKCQlpZiAoMCA8PSByZXQpCgkJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhhMiArIGksIHYpOwoJfQoJaWYgKDAgPD0gcmV0KQoJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhkYywgMHgwMSk7CglyZXR1cm4gcmV0Owp9CgovKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgcGFjNzMwMiBvbmx5ICovCnN0YXRpYyBpbnQgc2V0Y29sb3JzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKewoJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwoJaW50IGksIHY7CglpbnQgcmV0OwoJc3RhdGljIGNvbnN0IGludCBhWzldID0KCQl7MjE3LCAtMjEyLCAwLCAtMTAxLCAxNzAsIC02NywgLTM4LCAtMzE1LCAzNTV9OwoJc3RhdGljIGNvbnN0IGludCBiWzldID0KCQl7MTksIDEwNiwgMCwgMTksIDEwNiwgMSwgMTksIDEwNiwgMX07CgoJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDAzKTsJLyogcGFnZSAzICovCglpZiAoMCA8PSByZXQpCgkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDExLCAweDAxKTsKCWlmICgwIDw9IHJldCkKCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDApOwkvKiBwYWdlIDAgKi8KCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKCQl2ID0gYVtpXSAqIHNkLT5jb2xvcnMgLyBDT0xPUl9NQVggKyBiW2ldOwoJCWlmICgwIDw9IHJldCkKCQkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDBmICsgMiAqIGksICh2ID4+IDgpICYgMHgwNyk7CgkJaWYgKDAgPD0gcmV0KQoJCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4MGYgKyAyICogaSArIDEsIHYpOwoJfQoJaWYgKDAgPD0gcmV0KQoJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhkYywgMHgwMSk7CglQREVCVUcoRF9DT05GfERfU1RSRUFNLCAiY29sb3I6ICVpIiwgc2QtPmNvbG9ycyk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IHNldHdoaXRlYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCnsKCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKCWludCByZXQ7CgoJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDAwKTsJLyogcGFnZSAwICovCglpZiAoMCA8PSByZXQpCgkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGM2LCBzZC0+d2hpdGVfYmFsYW5jZSk7CgoJaWYgKDAgPD0gcmV0KQoJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhkYywgMHgwMSk7CglQREVCVUcoRF9DT05GfERfU1RSRUFNLCAid2hpdGVfYmFsYW5jZTogJWkiLCBzZC0+d2hpdGVfYmFsYW5jZSk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IHNldHJlZGJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CglpbnQgcmV0OwoKCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMCk7CS8qIHBhZ2UgMCAqLwoJaWYgKDAgPD0gcmV0KQoJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhjNSwgc2QtPnJlZF9iYWxhbmNlKTsKCglpZiAoMCA8PSByZXQpCgkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGRjLCAweDAxKTsKCVBERUJVRyhEX0NPTkZ8RF9TVFJFQU0sICJyZWRfYmFsYW5jZTogJWkiLCBzZC0+cmVkX2JhbGFuY2UpOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCBzZXRibHVlYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCnsKCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKCWludCByZXQ7CgoJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGZmLCAweDAwKTsJLyogcGFnZSAwICovCglpZiAoMCA8PSByZXQpCgkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGM3LCBzZC0+Ymx1ZV9iYWxhbmNlKTsKCglpZiAoMCA8PSByZXQpCgkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweGRjLCAweDAxKTsKCVBERUJVRyhEX0NPTkZ8RF9TVFJFQU0sICJibHVlX2JhbGFuY2U6ICVpIiwgc2QtPmJsdWVfYmFsYW5jZSk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IHNldGdhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CglpbnQgcmV0OwoKCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMyk7CQkvKiBwYWdlIDMgKi8KCWlmICgwIDw9IHJldCkKCQlyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4MTAsIHNkLT5nYWluID4+IDMpOwoKCS8qIGxvYWQgcmVnaXN0ZXJzIHRvIHNlbnNvciAoQml0IDAsIGF1dG8gY2xlYXIpICovCglpZiAoMCA8PSByZXQpCgkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDExLCAweDAxKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgc2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CglpbnQgcmV0OwoJX191OCByZWc7CgoJLyogcmVnaXN0ZXIgMiBvZiBmcmFtZSAzLzQgY29udGFpbnMgdGhlIGNsb2NrIGRpdmlkZXIgY29uZmlndXJpbmcgdGhlCgkgICBubyBmcHMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOiA2MCAvIHJlZy4gc2QtPmV4cG9zdXJlIGlzIHRoZQoJICAgZGVzaXJlZCBleHBvc3VyZSB0aW1lIGluIG1zLiAqLwoJcmVnID0gMTIwICogc2QtPmV4cG9zdXJlIC8gMTAwMDsKCWlmIChyZWcgPCAyKQoJCXJlZyA9IDI7CgllbHNlIGlmIChyZWcgPiA2MykKCQlyZWcgPSA2MzsKCgkvKiBPbiB0aGUgcGFjNzMwMiByZWcyIE1VU1QgYmUgYSBtdWx0aXBsZSBvZiAzLCBzbyByb3VuZCBpdCB0bwoJICAgdGhlIG5lYXJlc3QgbXVsdGlwbGUgb2YgMywgZXhjZXB0IHdoZW4gYmV0d2VlbiA2IGFuZCAxMj8gKi8KCWlmIChyZWcgPCA2IHx8IHJlZyA+IDEyKQoJCXJlZyA9ICgocmVnICsgMSkgLyAzKSAqIDM7CglyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDMpOwkJLyogcGFnZSAzICovCglpZiAoMCA8PSByZXQpCgkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDAyLCByZWcpOwoKCS8qIGxvYWQgcmVnaXN0ZXJzIHRvIHNlbnNvciAoQml0IDAsIGF1dG8gY2xlYXIpICovCglpZiAoMCA8PSByZXQpCgkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDExLCAweDAxKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgc2V0aHZmbGlwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKewoJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwoJaW50IHJldDsKCXU4IGRhdGEsIGhmbGlwLCB2ZmxpcDsKCgloZmxpcCA9IHNkLT5oZmxpcDsKCWlmIChzZC0+ZmxhZ3MgJiBGTF9IRkxJUCkKCQloZmxpcCA9ICFoZmxpcDsKCXZmbGlwID0gc2QtPnZmbGlwOwoJaWYgKHNkLT5mbGFncyAmIEZMX1ZGTElQKQoJCXZmbGlwID0gIXZmbGlwOwoKCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMyk7CQkvKiBwYWdlIDMgKi8KCWRhdGEgPSAoaGZsaXAgPyAweDA4IDogMHgwMCkgfCAodmZsaXAgPyAweDA0IDogMHgwMCk7CglpZiAoMCA8PSByZXQpCgkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDIxLCBkYXRhKTsKCS8qIGxvYWQgcmVnaXN0ZXJzIHRvIHNlbnNvciAoQml0IDAsIGF1dG8gY2xlYXIpICovCglpZiAoMCA8PSByZXQpCgkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDExLCAweDAxKTsKCXJldHVybiByZXQ7Cn0KCi8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHByb2JlIGFuZCByZXN1bWUgdGltZSBmb3IgcGFjNzMwMiAqLwpzdGF0aWMgaW50IHNkX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQp7CglyZXR1cm4gcmVnX3dfc2VxKGdzcGNhX2RldiwgaW5pdF83MzAyLCBzaXplb2YoaW5pdF83MzAyKS8yKTsKfQoKc3RhdGljIGludCBzZF9zdGFydChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCnsKCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKCWludCByZXQgPSAwOwoKCXNkLT5zb2ZfcmVhZCA9IDA7CgoJcmV0ID0gcmVnX3dfdmFyKGdzcGNhX2Rldiwgc3RhcnRfNzMwMiwKCQlwYWdlM183MzAyLCBzaXplb2YocGFnZTNfNzMwMiksCgkJTlVMTCwgMCk7CglpZiAoMCA8PSByZXQpCgkJcmV0ID0gc2V0YnJpZ2h0Y29udChnc3BjYV9kZXYpOwoJaWYgKDAgPD0gcmV0KQoJCXJldCA9IHNldGNvbG9ycyhnc3BjYV9kZXYpOwoJaWYgKDAgPD0gcmV0KQoJCXJldCA9IHNldHdoaXRlYmFsYW5jZShnc3BjYV9kZXYpOwoJaWYgKDAgPD0gcmV0KQoJCXJldCA9IHNldHJlZGJhbGFuY2UoZ3NwY2FfZGV2KTsKCWlmICgwIDw9IHJldCkKCQlyZXQgPSBzZXRibHVlYmFsYW5jZShnc3BjYV9kZXYpOwoJaWYgKDAgPD0gcmV0KQoJCXJldCA9IHNldGdhaW4oZ3NwY2FfZGV2KTsKCWlmICgwIDw9IHJldCkKCQlyZXQgPSBzZXRleHBvc3VyZShnc3BjYV9kZXYpOwoJaWYgKDAgPD0gcmV0KQoJCXJldCA9IHNldGh2ZmxpcChnc3BjYV9kZXYpOwoKCS8qIG9ubHkgcmVzb2x1dGlvbiA2NDB4NDgwIGlzIHN1cHBvcnRlZCBmb3IgcGFjNzMwMiAqLwoKCXNkLT5zb2ZfcmVhZCA9IDA7CglzZC0+YXV0b2dhaW5faWdub3JlX2ZyYW1lcyA9IDA7CglhdG9taWNfc2V0KCZzZC0+YXZnX2x1bSwgLTEpOwoKCS8qIHN0YXJ0IHN0cmVhbSAqLwoJaWYgKDAgPD0gcmV0KQoJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMSk7CglpZiAoMCA8PSByZXQpCgkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDc4LCAweDAxKTsKCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCBzZF9zdG9wTihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCnsKCWludCByZXQ7CgoJLyogc3RvcCBzdHJlYW0gKi8KCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMSk7CglpZiAoMCA8PSByZXQpCgkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCAweDc4LCAweDAwKTsKfQoKLyogY2FsbGVkIG9uIHN0cmVhbW9mZiB3aXRoIGFsdCAwIGFuZCBvbiBkaXNjb25uZWN0IGZvciBwYWM3MzAyICovCnN0YXRpYyB2b2lkIHNkX3N0b3AwKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKewoJaW50IHJldDsKCglpZiAoIWdzcGNhX2Rldi0+cHJlc2VudCkKCQlyZXR1cm47CglyZXQgPSByZWdfdyhnc3BjYV9kZXYsIDB4ZmYsIDB4MDEpOwoJaWYgKDAgPD0gcmV0KQoJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHg3OCwgMHg0MCk7Cn0KCi8qIEluY2x1ZGUgcGFjIGNvbW1vbiBzb2YgZGV0ZWN0aW9uIGZ1bmN0aW9ucyAqLwojaW5jbHVkZSAicGFjX2NvbW1vbi5oIgoKc3RhdGljIHZvaWQgZG9fYXV0b2dhaW4oc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CglpbnQgYXZnX2x1bSA9IGF0b21pY19yZWFkKCZzZC0+YXZnX2x1bSk7CglpbnQgZGVzaXJlZF9sdW0sIGRlYWR6b25lOwoKCWlmIChhdmdfbHVtID09IC0xKQoJCXJldHVybjsKCglkZXNpcmVkX2x1bSA9IDI3MCArIHNkLT5icmlnaHRuZXNzICogNDsKCS8qIEhhY2sgaGFjaywgd2l0aCB0aGUgNzIwMiB0aGUgZmlyc3QgZXhwb3N1cmUgc3RlcCBpcwoJICAgcHJldHR5IGxhcmdlLCBzbyBpZiB3ZSdyZSBhYm91dCB0byBtYWtlIHRoZSBmaXJzdAoJICAgZXhwb3N1cmUgaW5jcmVhc2UgbWFrZSB0aGUgZGVhZHpvbmUgbGFyZ2UgdG8gYXZvaWQKCSAgIG9zY2lsYXRpbmcgKi8KCWlmIChkZXNpcmVkX2x1bSA+IGF2Z19sdW0gJiYgc2QtPmdhaW4gPT0gR0FJTl9ERUYgJiYKCQkJc2QtPmV4cG9zdXJlID4gRVhQT1NVUkVfREVGICYmCgkJCXNkLT5leHBvc3VyZSA8IDQyKQoJCWRlYWR6b25lID0gOTA7CgllbHNlCgkJZGVhZHpvbmUgPSAzMDsKCglpZiAoc2QtPmF1dG9nYWluX2lnbm9yZV9mcmFtZXMgPiAwKQoJCXNkLT5hdXRvZ2Fpbl9pZ25vcmVfZnJhbWVzLS07CgllbHNlIGlmIChnc3BjYV9hdXRvX2dhaW5fbl9leHBvc3VyZShnc3BjYV9kZXYsIGF2Z19sdW0sIGRlc2lyZWRfbHVtLAoJCQlkZWFkem9uZSwgR0FJTl9LTkVFLCBFWFBPU1VSRV9LTkVFKSkKCQlzZC0+YXV0b2dhaW5faWdub3JlX2ZyYW1lcyA9IFBBQ19BVVRPR0FJTl9JR05PUkVfRlJBTUVTOwp9CgovKiBKUEVHIGhlYWRlciwgcGFydCAxICovCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBhY19qcGVnX2hlYWRlcjFbXSA9IHsKICAweGZmLCAweGQ4LAkJLyogU09JOiBTdGFydCBvZiBJbWFnZSAqLwoKICAweGZmLCAweGMwLAkJLyogU09GMDogU3RhcnQgb2YgRnJhbWUgKEJhc2VsaW5lIERDVCkgKi8KICAweDAwLCAweDExLAkJLyogbGVuZ3RoID0gMTcgYnl0ZXMgKGluY2x1ZGluZyB0aGlzIGxlbmd0aCBmaWVsZCkgKi8KICAweDA4CQkJLyogUHJlY2lzaW9uOiA4ICovCiAgLyogMiBieXRlcyBpcyBwbGFjZWQgaGVyZTogbnVtYmVyIG9mIGltYWdlIGxpbmVzICovCiAgLyogMiBieXRlcyBpcyBwbGFjZWQgaGVyZTogc2FtcGxlcyBwZXIgbGluZSAqLwp9OwoKLyogSlBFRyBoZWFkZXIsIGNvbnRpbnVlZCAqLwpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwYWNfanBlZ19oZWFkZXIyW10gPSB7CiAgMHgwMywJCQkvKiBOdW1iZXIgb2YgaW1hZ2UgY29tcG9uZW50czogMyAqLwogIDB4MDEsIDB4MjEsIDB4MDAsCS8qIElEPTEsIFN1YnNhbXBsaW5nIDF4MSwgUXVhbnRpemF0aW9uIHRhYmxlOiAwICovCiAgMHgwMiwgMHgxMSwgMHgwMSwJLyogSUQ9MiwgU3Vic2FtcGxpbmcgMngxLCBRdWFudGl6YXRpb24gdGFibGU6IDEgKi8KICAweDAzLCAweDExLCAweDAxLAkvKiBJRD0zLCBTdWJzYW1wbGluZyAyeDEsIFF1YW50aXphdGlvbiB0YWJsZTogMSAqLwoKICAweGZmLCAweGRhLAkJLyogU09TOiBTdGFydCBPZiBTY2FuICovCiAgMHgwMCwgMHgwYywJCS8qIGxlbmd0aCA9IDEyIGJ5dGVzIChpbmNsdWRpbmcgdGhpcyBsZW5ndGggZmllbGQpICovCiAgMHgwMywJCQkvKiBudW1iZXIgb2YgY29tcG9uZW50czogMyAqLwogIDB4MDEsIDB4MDAsCQkvKiBzZWxlY3RvciAxLCB0YWJsZSAweDAwICovCiAgMHgwMiwgMHgxMSwJCS8qIHNlbGVjdG9yIDIsIHRhYmxlIDB4MTEgKi8KICAweDAzLCAweDExLAkJLyogc2VsZWN0b3IgMywgdGFibGUgMHgxMSAqLwogIDB4MDAsIDB4M2YsCQkvKiBTcGVjdHJhbCBzZWxlY3Rpb246IDAgLi4gNjMgKi8KICAweDAwCQkJLyogU3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uOiAwICovCn07CgpzdGF0aWMgdm9pZCBwYWNfc3RhcnRfZnJhbWUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAoJCXN0cnVjdCBnc3BjYV9mcmFtZSAqZnJhbWUsCgkJX191MTYgbGluZXMsIF9fdTE2IHNhbXBsZXNfcGVyX2xpbmUpCnsKCXVuc2lnbmVkIGNoYXIgdG1wYnVmWzRdOwoKCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwKCQlwYWNfanBlZ19oZWFkZXIxLCBzaXplb2YocGFjX2pwZWdfaGVhZGVyMSkpOwoKCXRtcGJ1ZlswXSA9IGxpbmVzID4+IDg7Cgl0bXBidWZbMV0gPSBsaW5lcyAmIDB4ZmY7Cgl0bXBidWZbMl0gPSBzYW1wbGVzX3Blcl9saW5lID4+IDg7Cgl0bXBidWZbM10gPSBzYW1wbGVzX3Blcl9saW5lICYgMHhmZjsKCglnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsCgkJdG1wYnVmLCBzaXplb2YodG1wYnVmKSk7Cglnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBJTlRFUl9QQUNLRVQsCgkJcGFjX2pwZWdfaGVhZGVyMiwgc2l6ZW9mKHBhY19qcGVnX2hlYWRlcjIpKTsKfQoKLyogdGhpcyBmdW5jdGlvbiBpcyBydW4gYXQgaW50ZXJydXB0IGxldmVsICovCnN0YXRpYyB2b2lkIHNkX3BrdF9zY2FuKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwKCQkJdTggKmRhdGEsCQkJLyogaXNvYyBwYWNrZXQgKi8KCQkJaW50IGxlbikJCQkvKiBpc28gcGFja2V0IGxlbmd0aCAqLwp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CglzdHJ1Y3QgZ3NwY2FfZnJhbWUgKmZyYW1lOwoJdW5zaWduZWQgY2hhciAqc29mOwoKCXNvZiA9IHBhY19maW5kX3NvZigmc2QtPnNvZl9yZWFkLCBkYXRhLCBsZW4pOwoJaWYgKHNvZikgewoJCWludCBuLCBsdW1fb2Zmc2V0LCBmb290ZXJfbGVuZ3RoOwoKCQlmcmFtZSA9IGdzcGNhX2dldF9pX2ZyYW1lKGdzcGNhX2Rldik7CgkJaWYgKGZyYW1lID09IE5VTEwpIHsKCQkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CgkJCXJldHVybjsKCQl9CgoJCS8qIDYgYnl0ZXMgYWZ0ZXIgdGhlIEZGIEQ5IEVPRiBtYXJrZXIgYSBudW1iZXIgb2YgbHVtaW5hdGlvbgoJCSAgIGJ5dGVzIGFyZSBzZW5kIGNvcnJlc3BvbmRpbmcgdG8gZGlmZmVyZW50IHBhcnRzIG9mIHRoZQoJCSAgIGltYWdlLCB0aGUgMTR0aCBhbmQgMTV0aCBieXRlIGFmdGVyIHRoZSBFT0Ygc2VlbSB0bwoJCSAgIGNvcnJlc3BvbmQgdG8gdGhlIGNlbnRlciBvZiB0aGUgaW1hZ2UgKi8KCQlsdW1fb2Zmc2V0ID0gNjEgKyBzaXplb2YgcGFjX3NvZl9tYXJrZXI7CgkJZm9vdGVyX2xlbmd0aCA9IDc0OwoKCQkvKiBGaW5pc2ggZGVjb2RpbmcgY3VycmVudCBmcmFtZSAqLwoJCW4gPSAoc29mIC0gZGF0YSkgLSAoZm9vdGVyX2xlbmd0aCArIHNpemVvZiBwYWNfc29mX21hcmtlcik7CgkJaWYgKG4gPCAwKSB7CgkJCWZyYW1lLT5kYXRhX2VuZCArPSBuOwoJCQluID0gMDsKCQl9CgkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULAoJCQkJCWRhdGEsIG4pOwoJCWlmIChnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgIT0gRElTQ0FSRF9QQUNLRVQgJiYKCQkJCWZyYW1lLT5kYXRhX2VuZFstMl0gPT0gMHhmZiAmJgoJCQkJZnJhbWUtPmRhdGFfZW5kWy0xXSA9PSAweGQ5KQoJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBMQVNUX1BBQ0tFVCwKCQkJCQkJTlVMTCwgMCk7CgoJCW4gPSBzb2YgLSBkYXRhOwoJCWxlbiAtPSBuOwoJCWRhdGEgPSBzb2Y7CgoJCS8qIEdldCBhdmVyYWdlIGx1bWluYXRpb24gKi8KCQlpZiAoZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID09IExBU1RfUEFDS0VUICYmCgkJCQluID49IGx1bV9vZmZzZXQpCgkJCWF0b21pY19zZXQoJnNkLT5hdmdfbHVtLCBkYXRhWy1sdW1fb2Zmc2V0XSArCgkJCQkJCWRhdGFbLWx1bV9vZmZzZXQgKyAxXSk7CgkJZWxzZQoJCQlhdG9taWNfc2V0KCZzZC0+YXZnX2x1bSwgLTEpOwoKCQkvKiBTdGFydCB0aGUgbmV3IGZyYW1lIHdpdGggdGhlIGpwZWcgaGVhZGVyICovCgkJLyogVGhlIFBBQzczMDIgaGFzIHRoZSBpbWFnZSByb3RhdGVkIDkwIGRlZ3JlZXMgKi8KCQlwYWNfc3RhcnRfZnJhbWUoZ3NwY2FfZGV2LCBmcmFtZSwKCQkJZ3NwY2FfZGV2LT53aWR0aCwgZ3NwY2FfZGV2LT5oZWlnaHQpOwoJfQoJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOwp9CgpzdGF0aWMgaW50IHNkX3NldGJyaWdodG5lc3Moc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCnsKCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKCglzZC0+YnJpZ2h0bmVzcyA9IHZhbDsKCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKCQlzZXRicmlnaHRjb250KGdzcGNhX2Rldik7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzZF9nZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgKnZhbCkKewoJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwoKCSp2YWwgPSBzZC0+YnJpZ2h0bmVzczsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNkX3NldGNvbnRyYXN0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CgoJc2QtPmNvbnRyYXN0ID0gdmFsOwoJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKSB7CgkJc2V0YnJpZ2h0Y29udChnc3BjYV9kZXYpOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc2RfZ2V0Y29udHJhc3Qoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CgoJKnZhbCA9IHNkLT5jb250cmFzdDsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNkX3NldGNvbG9ycyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKewoJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwoKCXNkLT5jb2xvcnMgPSB2YWw7CglpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCgkJc2V0Y29sb3JzKGdzcGNhX2Rldik7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzZF9nZXRjb2xvcnMoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CgoJKnZhbCA9IHNkLT5jb2xvcnM7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzZF9zZXR3aGl0ZWJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCnsKCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKCWludCByZXQgPSAwOwoKCXNkLT53aGl0ZV9iYWxhbmNlID0gdmFsOwoJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQoJCXJldCA9IHNldHdoaXRlYmFsYW5jZShnc3BjYV9kZXYpOwoJaWYgKDAgPD0gcmV0KQoJCXJldCA9IDA7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IHNkX2dldHdoaXRlYmFsYW5jZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCnsKCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKCgkqdmFsID0gc2QtPndoaXRlX2JhbGFuY2U7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzZF9zZXRyZWRiYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CglpbnQgcmV0ID0gMDsKCglzZC0+cmVkX2JhbGFuY2UgPSB2YWw7CglpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCgkJcmV0ID0gc2V0cmVkYmFsYW5jZShnc3BjYV9kZXYpOwoJaWYgKDAgPD0gcmV0KQoJCXJldCA9IDA7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IHNkX2dldHJlZGJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CgoJKnZhbCA9IHNkLT5yZWRfYmFsYW5jZTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNkX3NldGJsdWViYWxhbmNlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CglpbnQgcmV0ID0gMDsKCglzZC0+Ymx1ZV9iYWxhbmNlID0gdmFsOwoJaWYgKGdzcGNhX2Rldi0+c3RyZWFtaW5nKQoJCXJldCA9IHNldGJsdWViYWxhbmNlKGdzcGNhX2Rldik7CglpZiAoMCA8PSByZXQpCgkJcmV0ID0gMDsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgc2RfZ2V0Ymx1ZWJhbGFuY2Uoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CgoJKnZhbCA9IHNkLT5ibHVlX2JhbGFuY2U7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzZF9zZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CgoJc2QtPmdhaW4gPSB2YWw7CglpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCgkJc2V0Z2Fpbihnc3BjYV9kZXYpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc2RfZ2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCnsKCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKCgkqdmFsID0gc2QtPmdhaW47CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzZF9zZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyIHZhbCkKewoJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OwoKCXNkLT5leHBvc3VyZSA9IHZhbDsKCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykKCQlzZXRleHBvc3VyZShnc3BjYV9kZXYpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc2RfZ2V0ZXhwb3N1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiAqdmFsKQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CgoJKnZhbCA9IHNkLT5leHBvc3VyZTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNkX3NldGF1dG9nYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgX19zMzIgdmFsKQp7CglzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CgoJc2QtPmF1dG9nYWluID0gdmFsOwoJLyogd2hlbiBzd2l0Y2hpbmcgdG8gYXV0b2dhaW4gc2V0IGRlZmF1bHRzIHRvIG1ha2Ugc3VyZQoJICAgd2UgYXJlIG9uIGEgdmFsaWQgcG9pbnQgb2YgdGhlIGF1dG9nYWluIGdhaW4gLwoJICAgZXhwb3N1cmUga25lZSBncmFwaCwgYW5kIGdpdmUgdGhpcyBjaGFuZ2UgdGltZSB0bwoJICAgdGFrZSBlZmZlY3QgYmVmb3JlIGRvaW5nIGF1dG9nYWluLiAqLwoJaWYgKHNkLT5hdXRvZ2FpbikgewoJCXNkLT5leHBvc3VyZSA9IEVYUE9TVVJFX0RFRjsKCQlzZC0+Z2FpbiA9IEdBSU5fREVGOwoJCWlmIChnc3BjYV9kZXYtPnN0cmVhbWluZykgewoJCQlzZC0+YXV0b2dhaW5faWdub3JlX2ZyYW1lcyA9CgkJCQlQQUNfQVVUT0dBSU5fSUdOT1JFX0ZSQU1FUzsKCQkJc2V0ZXhwb3N1cmUoZ3NwY2FfZGV2KTsKCQkJc2V0Z2Fpbihnc3BjYV9kZXYpOwoJCX0KCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzZF9nZXRhdXRvZ2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCnsKCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKCgkqdmFsID0gc2QtPmF1dG9nYWluOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc2Rfc2V0aGZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCnsKCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKCglzZC0+aGZsaXAgPSB2YWw7CglpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCgkJc2V0aHZmbGlwKGdzcGNhX2Rldik7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzZF9nZXRoZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCnsKCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKCgkqdmFsID0gc2QtPmhmbGlwOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc2Rfc2V0dmZsaXAoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCBfX3MzMiB2YWwpCnsKCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKCglzZC0+dmZsaXAgPSB2YWw7CglpZiAoZ3NwY2FfZGV2LT5zdHJlYW1pbmcpCgkJc2V0aHZmbGlwKGdzcGNhX2Rldik7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBzZF9nZXR2ZmxpcChzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIF9fczMyICp2YWwpCnsKCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopIGdzcGNhX2RldjsKCgkqdmFsID0gc2QtPnZmbGlwOwoJcmV0dXJuIDA7Cn0KCiNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCnN0YXRpYyBpbnQgc2RfZGJnX3NfcmVnaXN0ZXIoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAoJCQlzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKewoJaW50IHJldCA9IC1FSU5WQUw7CglfX3U4IGluZGV4OwoJX191OCB2YWx1ZTsKCgkvKiByZWctPnJlZzogYml0MC4uMTU6IHJlc2VydmVkIGZvciByZWdpc3RlciBpbmRleCAod0luZGV4IGlzIDE2Yml0CgkJCSAgICAgICBsb25nIG9uIHRoZSBVU0IgYnVzKQoJKi8KCWlmIChyZWctPm1hdGNoLnR5cGUgPT0gVjRMMl9DSElQX01BVENIX0hPU1QgJiYKCSAgICByZWctPm1hdGNoLmFkZHIgPT0gMCAmJgoJICAgIChyZWctPnJlZyA8IDB4MDAwMDAwZmYpICYmCgkgICAgKHJlZy0+dmFsIDw9IDB4MDAwMDAwZmYpCgkpIHsKCQkvKiBDdXJyZW50bHkgd3JpdGluZyB0byBwYWdlIDAgaXMgb25seSBzdXBwb3J0ZWQuICovCgkJLyogcmVnX3coKSBvbmx5IHN1cHBvcnRzIDhiaXQgaW5kZXggKi8KCQlpbmRleCA9IHJlZy0+cmVnICYgMHgwMDAwMDBmZjsKCQl2YWx1ZSA9IHJlZy0+dmFsICYgMHgwMDAwMDBmZjsKCgkJLyogTm90ZSB0aGF0IHRoZXJlIHNoYWxsIGJlIG5vIGFjY2VzcyB0byBvdGhlciBwYWdlCgkJICAgYnkgYW55IG90aGVyIGZ1bmN0aW9uIGJldHdlZW4gdGhlIHBhZ2Ugc3dpdGggYW5kCgkJICAgdGhlIGFjdHVhbCByZWdpc3RlciB3cml0ZSAqLwoJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhmZiwgMHgwMCk7CS8qIHBhZ2UgMCAqLwoJCWlmICgwIDw9IHJldCkKCQkJcmV0ID0gcmVnX3coZ3NwY2FfZGV2LCBpbmRleCwgdmFsdWUpOwoKCQlpZiAoMCA8PSByZXQpCgkJCXJldCA9IHJlZ193KGdzcGNhX2RldiwgMHhkYywgMHgwMSk7Cgl9CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IHNkX2NoaXBfaWRlbnQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAoJCQlzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqY2hpcCkKewoJaW50IHJldCA9IC1FSU5WQUw7CgoJaWYgKGNoaXAtPm1hdGNoLnR5cGUgPT0gVjRMMl9DSElQX01BVENIX0hPU1QgJiYKCSAgICBjaGlwLT5tYXRjaC5hZGRyID09IDApIHsKCQljaGlwLT5yZXZpc2lvbiA9IDA7CgkJY2hpcC0+aWRlbnQgPSBWNEwyX0lERU5UX1VOS05PV047CgkJcmV0ID0gMDsKCX0KCXJldHVybiByZXQ7Cn0KI2VuZGlmCgovKiBzdWItZHJpdmVyIGRlc2NyaXB0aW9uIGZvciBwYWM3MzAyICovCnN0YXRpYyBzdHJ1Y3Qgc2RfZGVzYyBzZF9kZXNjID0gewoJLm5hbWUgPSBNT0RVTEVfTkFNRSwKCS5jdHJscyA9IHNkX2N0cmxzLAoJLm5jdHJscyA9IEFSUkFZX1NJWkUoc2RfY3RybHMpLAoJLmNvbmZpZyA9IHNkX2NvbmZpZywKCS5pbml0ID0gc2RfaW5pdCwKCS5zdGFydCA9IHNkX3N0YXJ0LAoJLnN0b3BOID0gc2Rfc3RvcE4sCgkuc3RvcDAgPSBzZF9zdG9wMCwKCS5wa3Rfc2NhbiA9IHNkX3BrdF9zY2FuLAoJLmRxX2NhbGxiYWNrID0gZG9fYXV0b2dhaW4sCiNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCgkuc2V0X3JlZ2lzdGVyID0gc2RfZGJnX3NfcmVnaXN0ZXIsCgkuZ2V0X2NoaXBfaWRlbnQgPSBzZF9jaGlwX2lkZW50LAojZW5kaWYKfTsKCi8qIC0tIG1vZHVsZSBpbml0aWFsaXNhdGlvbiAtLSAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlW10gX19kZXZpbml0Y29uc3QgPSB7Cgl7VVNCX0RFVklDRSgweDA2ZjgsIDB4MzAwOSl9LAoJe1VTQl9ERVZJQ0UoMHgwOTNhLCAweDI2MjApfSwKCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjIxKX0sCgl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyMiksIC5kcml2ZXJfaW5mbyA9IEZMX1ZGTElQfSwKCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjI0KSwgLmRyaXZlcl9pbmZvID0gRkxfVkZMSVB9LAoJe1VTQl9ERVZJQ0UoMHgwOTNhLCAweDI2MjYpfSwKCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjI4KX0sCgl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyOSksIC5kcml2ZXJfaW5mbyA9IEZMX1ZGTElQfSwKCXtVU0JfREVWSUNFKDB4MDkzYSwgMHgyNjJhKX0sCgl7VVNCX0RFVklDRSgweDA5M2EsIDB4MjYyYyl9LAoJe30KfTsKTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRldmljZV90YWJsZSk7CgovKiAtLSBkZXZpY2UgY29ubmVjdCAtLSAqLwpzdGF0aWMgaW50IF9fZGV2aW5pdCBzZF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQp7CglyZXR1cm4gZ3NwY2FfZGV2X3Byb2JlKGludGYsIGlkLCAmc2RfZGVzYywgc2l6ZW9mKHN0cnVjdCBzZCksCgkJCQlUSElTX01PRFVMRSk7Cn0KCnN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBzZF9kcml2ZXIgPSB7CgkubmFtZSA9IE1PRFVMRV9OQU1FLAoJLmlkX3RhYmxlID0gZGV2aWNlX3RhYmxlLAoJLnByb2JlID0gc2RfcHJvYmUsCgkuZGlzY29ubmVjdCA9IGdzcGNhX2Rpc2Nvbm5lY3QsCiNpZmRlZiBDT05GSUdfUE0KCS5zdXNwZW5kID0gZ3NwY2Ffc3VzcGVuZCwKCS5yZXN1bWUgPSBnc3BjYV9yZXN1bWUsCiNlbmRpZgp9OwoKLyogLS0gbW9kdWxlIGluc2VydCAvIHJlbW92ZSAtLSAqLwpzdGF0aWMgaW50IF9faW5pdCBzZF9tb2RfaW5pdCh2b2lkKQp7CglpbnQgcmV0OwoJcmV0ID0gdXNiX3JlZ2lzdGVyKCZzZF9kcml2ZXIpOwoJaWYgKHJldCA8IDApCgkJcmV0dXJuIHJldDsKCVBERUJVRyhEX1BST0JFLCAicmVnaXN0ZXJlZCIpOwoJcmV0dXJuIDA7Cn0Kc3RhdGljIHZvaWQgX19leGl0IHNkX21vZF9leGl0KHZvaWQpCnsKCXVzYl9kZXJlZ2lzdGVyKCZzZF9kcml2ZXIpOwoJUERFQlVHKERfUFJPQkUsICJkZXJlZ2lzdGVyZWQiKTsKfQoKbW9kdWxlX2luaXQoc2RfbW9kX2luaXQpOwptb2R1bGVfZXhpdChzZF9tb2RfZXhpdCk7Cg==