LyoKICogU2NhdHRlcmxpc3QgQ3J5cHRvZ3JhcGhpYyBBUEkuCiAqCiAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KICogQ29weXJpZ2h0IChjKSAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKICogQ29weXJpZ2h0IChjKSAyMDA1IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KICoKICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIENyeXB0b2FwaSwgYnkgQWxleGFuZGVyIEtqZWxkYWFzIDxhc3RvckBmYXN0Lm5vPgogKiBhbmQgTmV0dGxlLCBieSBOaWVscyBN9mxsZXIuCiAqIAogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICovCiNpZm5kZWYgX0xJTlVYX0NSWVBUT19ICiNkZWZpbmUgX0xJTlVYX0NSWVBUT19ICgojaW5jbHVkZSA8YXNtL2F0b21pYy5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgoKLyoKICogQWxnb3JpdGhtIG1hc2tzIGFuZCB0eXBlcy4KICovCiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX01BU0sJCTB4MDAwMDAwMGYKI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSCQkweDAwMDAwMDAxCiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVAkJMHgwMDAwMDAwMgojZGVmaW5lIENSWVBUT19BTEdfVFlQRV9IQVNICQkweDAwMDAwMDAzCiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUgkweDAwMDAwMDA0CiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTCTB4MDAwMDAwMDUKCiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0hBU0hfTUFTSwkweDAwMDAwMDBlCgojZGVmaW5lIENSWVBUT19BTEdfTEFSVkFMCQkweDAwMDAwMDEwCiNkZWZpbmUgQ1JZUFRPX0FMR19ERUFECQkJMHgwMDAwMDAyMAojZGVmaW5lIENSWVBUT19BTEdfRFlJTkcJCTB4MDAwMDAwNDAKI2RlZmluZSBDUllQVE9fQUxHX0FTWU5DCQkweDAwMDAwMDgwCgovKgogKiBTZXQgdGhpcyBiaXQgaWYgYW5kIG9ubHkgaWYgdGhlIGFsZ29yaXRobSByZXF1aXJlcyBhbm90aGVyIGFsZ29yaXRobSBvZgogKiB0aGUgc2FtZSB0eXBlIHRvIGhhbmRsZSBjb3JuZXIgY2FzZXMuCiAqLwojZGVmaW5lIENSWVBUT19BTEdfTkVFRF9GQUxMQkFDSwkweDAwMDAwMTAwCgovKgogKiBUcmFuc2Zvcm0gbWFza3MgYW5kIHZhbHVlcyAoZm9yIGNydF9mbGFncykuCiAqLwojZGVmaW5lIENSWVBUT19URk1fUkVRX01BU0sJCTB4MDAwZmZmMDAKI2RlZmluZSBDUllQVE9fVEZNX1JFU19NQVNLCQkweGZmZjAwMDAwCgojZGVmaW5lIENSWVBUT19URk1fUkVRX1dFQUtfS0VZCQkweDAwMDAwMTAwCiNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQCTB4MDAwMDAyMDAKI2RlZmluZSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWQkJMHgwMDEwMDAwMAojZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOICAgCTB4MDAyMDAwMDAKI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX1NDSEVEIAkweDAwNDAwMDAwCiNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0JMT0NLX0xFTiAJMHgwMDgwMDAwMAojZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9GTEFHUyAJMHgwMTAwMDAwMAoKLyoKICogTWlzY2VsbGFuZW91cyBzdHVmZi4KICovCiNkZWZpbmUgQ1JZUFRPX01BWF9BTEdfTkFNRQkJNjQKCi8qCiAqIFRoZSBtYWNybyBDUllQVE9fTUlOQUxJR05fQVRUUiAoYWxvbmcgd2l0aCB0aGUgdm9pZCAqIHR5cGUgaW4gdGhlIGFjdHVhbAogKiBkZWNsYXJhdGlvbikgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgY3J5cHRvX3RmbSBjb250ZXh0IHN0cnVjdHVyZSBpcwogKiBhbGlnbmVkIGNvcnJlY3RseSBmb3IgdGhlIGdpdmVuIGFyY2hpdGVjdHVyZSBzbyB0aGF0IHRoZXJlIGFyZSBubyBhbGlnbm1lbnQKICogZmF1bHRzIGZvciBDIGRhdGEgdHlwZXMuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIGlzIHJlcXVpcmVkIG9uIHBsYXRmb3JtcyBzdWNoCiAqIGFzIGFybSB3aGVyZSBwb2ludGVycyBhcmUgMzItYml0IGFsaWduZWQgYnV0IHRoZXJlIGFyZSBkYXRhIHR5cGVzIHN1Y2ggYXMKICogdTY0IHdoaWNoIHJlcXVpcmUgNjQtYml0IGFsaWdubWVudC4KICovCiNpZiBkZWZpbmVkKEFSQ0hfS01BTExPQ19NSU5BTElHTikKI2RlZmluZSBDUllQVE9fTUlOQUxJR04gQVJDSF9LTUFMTE9DX01JTkFMSUdOCiNlbGlmIGRlZmluZWQoQVJDSF9TTEFCX01JTkFMSUdOKQojZGVmaW5lIENSWVBUT19NSU5BTElHTiBBUkNIX1NMQUJfTUlOQUxJR04KI2VuZGlmCgojaWZkZWYgQ1JZUFRPX01JTkFMSUdOCiNkZWZpbmUgQ1JZUFRPX01JTkFMSUdOX0FUVFIgX19hdHRyaWJ1dGVfXyAoKF9fYWxpZ25lZF9fKENSWVBUT19NSU5BTElHTikpKQojZWxzZQojZGVmaW5lIENSWVBUT19NSU5BTElHTl9BVFRSCiNlbmRpZgoKc3RydWN0IHNjYXR0ZXJsaXN0OwpzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlcjsKc3RydWN0IGNyeXB0b19oYXNoOwpzdHJ1Y3QgY3J5cHRvX3RmbTsKc3RydWN0IGNyeXB0b190eXBlOwoKc3RydWN0IGJsa2NpcGhlcl9kZXNjIHsKCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm07Cgl2b2lkICppbmZvOwoJdTMyIGZsYWdzOwp9OwoKc3RydWN0IGNpcGhlcl9kZXNjIHsKCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07Cgl2b2lkICgqY3Jmbikoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Cgl1bnNpZ25lZCBpbnQgKCpwcmZuKShjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsIHU4ICpkc3QsCgkJCSAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcyk7Cgl2b2lkICppbmZvOwp9OwoKc3RydWN0IGhhc2hfZGVzYyB7CglzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbTsKCXUzMiBmbGFnczsKfTsKCi8qCiAqIEFsZ29yaXRobXM6IG1vZHVsYXIgY3J5cHRvIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbnMsIG1hbmFnZWQKICogdmlhIGNyeXB0b19yZWdpc3Rlcl9hbGcoKSBhbmQgY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCkuCiAqLwpzdHJ1Y3QgYmxrY2lwaGVyX2FsZyB7CglpbnQgKCpzZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksCgkgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4pOwoJaW50ICgqZW5jcnlwdCkoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAoJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkJICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOwoJaW50ICgqZGVjcnlwdCkoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAoJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkJICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOwoKCXVuc2lnbmVkIGludCBtaW5fa2V5c2l6ZTsKCXVuc2lnbmVkIGludCBtYXhfa2V5c2l6ZTsKCXVuc2lnbmVkIGludCBpdnNpemU7Cn07CgpzdHJ1Y3QgY2lwaGVyX2FsZyB7Cgl1bnNpZ25lZCBpbnQgY2lhX21pbl9rZXlzaXplOwoJdW5zaWduZWQgaW50IGNpYV9tYXhfa2V5c2l6ZTsKCWludCAoKmNpYV9zZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksCgkgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKTsKCXZvaWQgKCpjaWFfZW5jcnlwdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Cgl2b2lkICgqY2lhX2RlY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwp9OwoKc3RydWN0IGRpZ2VzdF9hbGcgewoJdW5zaWduZWQgaW50IGRpYV9kaWdlc3RzaXplOwoJdm9pZCAoKmRpYV9pbml0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKCXZvaWQgKCpkaWFfdXBkYXRlKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqZGF0YSwKCQkJICAgdW5zaWduZWQgaW50IGxlbik7Cgl2b2lkICgqZGlhX2ZpbmFsKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0KTsKCWludCAoKmRpYV9zZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksCgkgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKTsKfTsKCnN0cnVjdCBoYXNoX2FsZyB7CglpbnQgKCppbml0KShzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjKTsKCWludCAoKnVwZGF0ZSkoc3RydWN0IGhhc2hfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKCQkgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKCWludCAoKmZpbmFsKShzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLCB1OCAqb3V0KTsKCWludCAoKmRpZ2VzdCkoc3RydWN0IGhhc2hfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKCQkgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqb3V0KTsKCWludCAoKnNldGtleSkoc3RydWN0IGNyeXB0b19oYXNoICp0Zm0sIGNvbnN0IHU4ICprZXksCgkJICAgICAgdW5zaWduZWQgaW50IGtleWxlbik7CgoJdW5zaWduZWQgaW50IGRpZ2VzdHNpemU7Cn07CgpzdHJ1Y3QgY29tcHJlc3NfYWxnIHsKCWludCAoKmNvYV9jb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKnNyYywKCQkJICAgIHVuc2lnbmVkIGludCBzbGVuLCB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOwoJaW50ICgqY29hX2RlY29tcHJlc3MpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICpzcmMsCgkJCSAgICAgIHVuc2lnbmVkIGludCBzbGVuLCB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOwp9OwoKI2RlZmluZSBjcmFfYmxrY2lwaGVyCWNyYV91LmJsa2NpcGhlcgojZGVmaW5lIGNyYV9jaXBoZXIJY3JhX3UuY2lwaGVyCiNkZWZpbmUgY3JhX2RpZ2VzdAljcmFfdS5kaWdlc3QKI2RlZmluZSBjcmFfaGFzaAljcmFfdS5oYXNoCiNkZWZpbmUgY3JhX2NvbXByZXNzCWNyYV91LmNvbXByZXNzCgpzdHJ1Y3QgY3J5cHRvX2FsZyB7CglzdHJ1Y3QgbGlzdF9oZWFkIGNyYV9saXN0OwoJc3RydWN0IGxpc3RfaGVhZCBjcmFfdXNlcnM7CgoJdTMyIGNyYV9mbGFnczsKCXVuc2lnbmVkIGludCBjcmFfYmxvY2tzaXplOwoJdW5zaWduZWQgaW50IGNyYV9jdHhzaXplOwoJdW5zaWduZWQgaW50IGNyYV9hbGlnbm1hc2s7CgoJaW50IGNyYV9wcmlvcml0eTsKCWF0b21pY190IGNyYV9yZWZjbnQ7CgoJY2hhciBjcmFfbmFtZVtDUllQVE9fTUFYX0FMR19OQU1FXTsKCWNoYXIgY3JhX2RyaXZlcl9uYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOwoKCWNvbnN0IHN0cnVjdCBjcnlwdG9fdHlwZSAqY3JhX3R5cGU7CgoJdW5pb24gewoJCXN0cnVjdCBibGtjaXBoZXJfYWxnIGJsa2NpcGhlcjsKCQlzdHJ1Y3QgY2lwaGVyX2FsZyBjaXBoZXI7CgkJc3RydWN0IGRpZ2VzdF9hbGcgZGlnZXN0OwoJCXN0cnVjdCBoYXNoX2FsZyBoYXNoOwoJCXN0cnVjdCBjb21wcmVzc19hbGcgY29tcHJlc3M7Cgl9IGNyYV91OwoKCWludCAoKmNyYV9pbml0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKTsKCXZvaWQgKCpjcmFfZXhpdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Cgl2b2lkICgqY3JhX2Rlc3Ryb3kpKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpOwoJCglzdHJ1Y3QgbW9kdWxlICpjcmFfbW9kdWxlOwp9OwoKLyoKICogQWxnb3JpdGhtIHJlZ2lzdHJhdGlvbiBpbnRlcmZhY2UuCiAqLwppbnQgY3J5cHRvX3JlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKaW50IGNyeXB0b191bnJlZ2lzdGVyX2FsZyhzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKCi8qCiAqIEFsZ29yaXRobSBxdWVyeSBpbnRlcmZhY2UuCiAqLwojaWZkZWYgQ09ORklHX0NSWVBUTwppbnQgY3J5cHRvX2hhc19hbGcoY29uc3QgY2hhciAqbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKTsKI2Vsc2UKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2hhc19hbGcoY29uc3QgY2hhciAqbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKQp7CglyZXR1cm4gMDsKfQojZW5kaWYKCi8qCiAqIFRyYW5zZm9ybXM6IHVzZXItaW5zdGFudGlhdGVkIG9iamVjdHMgd2hpY2ggZW5jYXBzdWxhdGUgYWxnb3JpdGhtcwogKiBhbmQgY29yZSBwcm9jZXNzaW5nIGxvZ2ljLiAgTWFuYWdlZCB2aWEgY3J5cHRvX2FsbG9jXyooKSBhbmQKICogY3J5cHRvX2ZyZWVfKigpLCBhcyB3ZWxsIGFzIHRoZSB2YXJpb3VzIGhlbHBlcnMgYmVsb3cuCiAqLwoKc3RydWN0IGJsa2NpcGhlcl90Zm0gewoJdm9pZCAqaXY7CglpbnQgKCpzZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICprZXksCgkJICAgICAgdW5zaWduZWQgaW50IGtleWxlbik7CglpbnQgKCplbmNyeXB0KShzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcyk7CglpbnQgKCpkZWNyeXB0KShzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcyk7Cn07CgpzdHJ1Y3QgY2lwaGVyX3RmbSB7Cgl2b2lkICpjaXRfaXY7Cgl1bnNpZ25lZCBpbnQgY2l0X2l2c2l6ZTsKCXUzMiBjaXRfbW9kZTsKCWludCAoKmNpdF9zZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKTsKCWludCAoKmNpdF9lbmNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOwoJaW50ICgqY2l0X2VuY3J5cHRfaXYpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCgkgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KTsKCWludCAoKmNpdF9kZWNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOwoJaW50ICgqY2l0X2RlY3J5cHRfaXYpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KTsKCXZvaWQgKCpjaXRfeG9yX2Jsb2NrKSh1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKCXZvaWQgKCpjaXRfZW5jcnlwdF9vbmUpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwoJdm9pZCAoKmNpdF9kZWNyeXB0X29uZSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Cn07CgpzdHJ1Y3QgaGFzaF90Zm0gewoJaW50ICgqaW5pdCkoc3RydWN0IGhhc2hfZGVzYyAqZGVzYyk7CglpbnQgKCp1cGRhdGUpKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsCgkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZyk7CglpbnQgKCpmaW5hbCkoc3RydWN0IGhhc2hfZGVzYyAqZGVzYywgdTggKm91dCk7CglpbnQgKCpkaWdlc3QpKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCgkJICAgICAgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCk7CglpbnQgKCpzZXRrZXkpKHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtLCBjb25zdCB1OCAqa2V5LAoJCSAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4pOwoJdW5zaWduZWQgaW50IGRpZ2VzdHNpemU7Cn07CgpzdHJ1Y3QgY29tcHJlc3NfdGZtIHsKCWludCAoKmNvdF9jb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKCSAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCgkgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7CglpbnQgKCpjb3RfZGVjb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKCSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKCSAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOwp9OwoKI2RlZmluZSBjcnRfYmxrY2lwaGVyCWNydF91LmJsa2NpcGhlcgojZGVmaW5lIGNydF9jaXBoZXIJY3J0X3UuY2lwaGVyCiNkZWZpbmUgY3J0X2hhc2gJY3J0X3UuaGFzaAojZGVmaW5lIGNydF9jb21wcmVzcwljcnRfdS5jb21wcmVzcwoKc3RydWN0IGNyeXB0b190Zm0gewoKCXUzMiBjcnRfZmxhZ3M7CgkKCXVuaW9uIHsKCQlzdHJ1Y3QgYmxrY2lwaGVyX3RmbSBibGtjaXBoZXI7CgkJc3RydWN0IGNpcGhlcl90Zm0gY2lwaGVyOwoJCXN0cnVjdCBoYXNoX3RmbSBoYXNoOwoJCXN0cnVjdCBjb21wcmVzc190Zm0gY29tcHJlc3M7Cgl9IGNydF91OwoJCglzdHJ1Y3QgY3J5cHRvX2FsZyAqX19jcnRfYWxnOwoKCXZvaWQgKl9fY3J0X2N0eFtdIENSWVBUT19NSU5BTElHTl9BVFRSOwp9OwoKc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgewoJc3RydWN0IGNyeXB0b190Zm0gYmFzZTsKfTsKCnN0cnVjdCBjcnlwdG9fY2lwaGVyIHsKCXN0cnVjdCBjcnlwdG9fdGZtIGJhc2U7Cn07CgpzdHJ1Y3QgY3J5cHRvX2NvbXAgewoJc3RydWN0IGNyeXB0b190Zm0gYmFzZTsKfTsKCnN0cnVjdCBjcnlwdG9faGFzaCB7CglzdHJ1Y3QgY3J5cHRvX3RmbSBiYXNlOwp9OwoKZW51bSB7CglDUllQVE9BX1VOU1BFQywKCUNSWVBUT0FfQUxHLAp9OwoKc3RydWN0IGNyeXB0b19hdHRyX2FsZyB7CgljaGFyIG5hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07Cn07CgovKiAKICogVHJhbnNmb3JtIHVzZXIgaW50ZXJmYWNlLgogKi8KIApzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX3RmbShjb25zdCBjaGFyICphbGdfbmFtZSwgdTMyIHRmbV9mbGFncyk7CnN0cnVjdCBjcnlwdG9fdGZtICpjcnlwdG9fYWxsb2NfYmFzZShjb25zdCBjaGFyICphbGdfbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKTsKdm9pZCBjcnlwdG9fZnJlZV90Zm0oc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CgovKgogKiBUcmFuc2Zvcm0gaGVscGVycyB3aGljaCBxdWVyeSB0aGUgdW5kZXJseWluZyBhbGdvcml0aG0uCiAqLwpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX25hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfbmFtZTsKfQoKc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjcnlwdG9fdGZtX2FsZ19kcml2ZXJfbmFtZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9kcml2ZXJfbmFtZTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX3RmbV9hbGdfcHJpb3JpdHkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfcHJpb3JpdHk7Cn0KCnN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY3J5cHRvX3RmbV9hbGdfbW9kbmFtZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglyZXR1cm4gbW9kdWxlX25hbWUodGZtLT5fX2NydF9hbGctPmNyYV9tb2R1bGUpOwp9CgpzdGF0aWMgaW5saW5lIHUzMiBjcnlwdG9fdGZtX2FsZ190eXBlKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0s7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9ibG9ja3NpemU7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9hbGlnbm1hc2s7Cn0KCnN0YXRpYyBpbmxpbmUgdTMyIGNyeXB0b190Zm1fZ2V0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiB0Zm0tPmNydF9mbGFnczsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b190Zm1fc2V0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKewoJdGZtLT5jcnRfZmxhZ3MgfD0gZmxhZ3M7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fdGZtX2NsZWFyX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKewoJdGZtLT5jcnRfZmxhZ3MgJj0gfmZsYWdzOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgKmNyeXB0b190Zm1fY3R4KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiB0Zm0tPl9fY3J0X2N0eDsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9jdHhfYWxpZ25tZW50KHZvaWQpCnsKCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07CglyZXR1cm4gX19hbGlnbm9mX18odGZtLT5fX2NydF9jdHgpOwp9CgovKgogKiBBUEkgd3JhcHBlcnMuCiAqLwpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICpfX2NyeXB0b19ibGtjaXBoZXJfY2FzdCgKCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiAoc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKil0Zm07Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKmNyeXB0b19ibGtjaXBoZXJfY2FzdCgKCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUik7CglyZXR1cm4gX19jcnlwdG9fYmxrY2lwaGVyX2Nhc3QodGZtKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigKCWNvbnN0IGNoYXIgKmFsZ19uYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spCnsKCXR5cGUgJj0gfkNSWVBUT19BTEdfVFlQRV9NQVNLOwoJdHlwZSB8PSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSOwoJbWFzayB8PSBDUllQVE9fQUxHX1RZUEVfTUFTSzsKCglyZXR1cm4gX19jcnlwdG9fYmxrY2lwaGVyX2Nhc3QoY3J5cHRvX2FsbG9jX2Jhc2UoYWxnX25hbWUsIHR5cGUsIG1hc2spKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2Jsa2NpcGhlcl90Zm0oCglzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CglyZXR1cm4gJnRmbS0+YmFzZTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19mcmVlX2Jsa2NpcGhlcihzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CgljcnlwdG9fZnJlZV90Zm0oY3J5cHRvX2Jsa2NpcGhlcl90Zm0odGZtKSk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19oYXNfYmxrY2lwaGVyKGNvbnN0IGNoYXIgKmFsZ19uYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spCnsKCXR5cGUgJj0gfkNSWVBUT19BTEdfVFlQRV9NQVNLOwoJdHlwZSB8PSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSOwoJbWFzayB8PSBDUllQVE9fQUxHX1RZUEVfTUFTSzsKCglyZXR1cm4gY3J5cHRvX2hhc19hbGcoYWxnX25hbWUsIHR5cGUsIG1hc2spOwp9CgpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b19ibGtjaXBoZXJfbmFtZShzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9hbGdfbmFtZShjcnlwdG9fYmxrY2lwaGVyX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxrY2lwaGVyX3RmbSAqY3J5cHRvX2Jsa2NpcGhlcl9jcnQoCglzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CglyZXR1cm4gJmNyeXB0b19ibGtjaXBoZXJfdGZtKHRmbSktPmNydF9ibGtjaXBoZXI7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGJsa2NpcGhlcl9hbGcgKmNyeXB0b19ibGtjaXBoZXJfYWxnKAoJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSkKewoJcmV0dXJuICZjcnlwdG9fYmxrY2lwaGVyX3RmbSh0Zm0pLT5fX2NydF9hbGctPmNyYV9ibGtjaXBoZXI7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19ibGtjaXBoZXJfaXZzaXplKHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2FsZyh0Zm0pLT5pdnNpemU7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19ibGtjaXBoZXJfYmxvY2tzaXplKAoJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSkKewoJcmV0dXJuIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShjcnlwdG9fYmxrY2lwaGVyX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2Jsa2NpcGhlcl9hbGlnbm1hc2soCglzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKGNyeXB0b19ibGtjaXBoZXJfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIHUzMiBjcnlwdG9fYmxrY2lwaGVyX2dldF9mbGFncyhzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9nZXRfZmxhZ3MoY3J5cHRvX2Jsa2NpcGhlcl90Zm0odGZtKSk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fYmxrY2lwaGVyX3NldF9mbGFncyhzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLAoJCQkJCSAgICAgIHUzMiBmbGFncykKewoJY3J5cHRvX3RmbV9zZXRfZmxhZ3MoY3J5cHRvX2Jsa2NpcGhlcl90Zm0odGZtKSwgZmxhZ3MpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2Jsa2NpcGhlcl9jbGVhcl9mbGFncyhzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLAoJCQkJCQl1MzIgZmxhZ3MpCnsKCWNyeXB0b190Zm1fY2xlYXJfZmxhZ3MoY3J5cHRvX2Jsa2NpcGhlcl90Zm0odGZtKSwgZmxhZ3MpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYmxrY2lwaGVyX3NldGtleShzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLAoJCQkJCSAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKewoJcmV0dXJuIGNyeXB0b19ibGtjaXBoZXJfY3J0KHRmbSktPnNldGtleShjcnlwdG9fYmxrY2lwaGVyX3RmbSh0Zm0pLAoJCQkJCQkga2V5LCBrZXlsZW4pOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAoJCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCnsKCWRlc2MtPmluZm8gPSBjcnlwdG9fYmxrY2lwaGVyX2NydChkZXNjLT50Zm0pLT5pdjsKCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2NydChkZXNjLT50Zm0pLT5lbmNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHRfaXYoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAoJCQkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkJCSAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCnsKCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2NydChkZXNjLT50Zm0pLT5lbmNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAoJCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCnsKCWRlc2MtPmluZm8gPSBjcnlwdG9fYmxrY2lwaGVyX2NydChkZXNjLT50Zm0pLT5pdjsKCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2NydChkZXNjLT50Zm0pLT5kZWNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHRfaXYoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAoJCQkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkJCSAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCnsKCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2NydChkZXNjLT50Zm0pLT5kZWNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2Jsa2NpcGhlcl9zZXRfaXYoc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSwKCQkJCQkgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKQp7CgltZW1jcHkoY3J5cHRvX2Jsa2NpcGhlcl9jcnQodGZtKS0+aXYsIHNyYywgbGVuKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19ibGtjaXBoZXJfZ2V0X2l2KHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0sCgkJCQkJICAgdTggKmRzdCwgdW5zaWduZWQgaW50IGxlbikKewoJbWVtY3B5KGRzdCwgY3J5cHRvX2Jsa2NpcGhlcl9jcnQodGZtKS0+aXYsIGxlbik7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19jaXBoZXIgKl9fY3J5cHRvX2NpcGhlcl9jYXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiAoc3RydWN0IGNyeXB0b19jaXBoZXIgKil0Zm07Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19jaXBoZXIgKmNyeXB0b19jaXBoZXJfY2FzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwoJcmV0dXJuIF9fY3J5cHRvX2NpcGhlcl9jYXN0KHRmbSk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19jaXBoZXIgKmNyeXB0b19hbGxvY19jaXBoZXIoY29uc3QgY2hhciAqYWxnX25hbWUsCgkJCQkJCQl1MzIgdHlwZSwgdTMyIG1hc2spCnsKCXR5cGUgJj0gfkNSWVBUT19BTEdfVFlQRV9NQVNLOwoJdHlwZSB8PSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOwoJbWFzayB8PSBDUllQVE9fQUxHX1RZUEVfTUFTSzsKCglyZXR1cm4gX19jcnlwdG9fY2lwaGVyX2Nhc3QoY3J5cHRvX2FsbG9jX2Jhc2UoYWxnX25hbWUsIHR5cGUsIG1hc2spKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2NpcGhlcl90Zm0oc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSkKewoJcmV0dXJuICZ0Zm0tPmJhc2U7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZnJlZV9jaXBoZXIoc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSkKewoJY3J5cHRvX2ZyZWVfdGZtKGNyeXB0b19jaXBoZXJfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9faGFzX2NpcGhlcihjb25zdCBjaGFyICphbGdfbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKQp7Cgl0eXBlICY9IH5DUllQVE9fQUxHX1RZUEVfTUFTSzsKCXR5cGUgfD0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUjsKCW1hc2sgfD0gQ1JZUFRPX0FMR19UWVBFX01BU0s7CgoJcmV0dXJuIGNyeXB0b19oYXNfYWxnKGFsZ19uYW1lLCB0eXBlLCBtYXNrKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY2lwaGVyX3RmbSAqY3J5cHRvX2NpcGhlcl9jcnQoc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSkKewoJcmV0dXJuICZjcnlwdG9fY2lwaGVyX3RmbSh0Zm0pLT5jcnRfY2lwaGVyOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fY2lwaGVyX2Jsb2Nrc2l6ZShzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKGNyeXB0b19jaXBoZXJfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fY2lwaGVyX2FsaWdubWFzayhzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKGNyeXB0b19jaXBoZXJfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIHUzMiBjcnlwdG9fY2lwaGVyX2dldF9mbGFncyhzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9nZXRfZmxhZ3MoY3J5cHRvX2NpcGhlcl90Zm0odGZtKSk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX3NldF9mbGFncyhzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLAoJCQkJCSAgIHUzMiBmbGFncykKewoJY3J5cHRvX3RmbV9zZXRfZmxhZ3MoY3J5cHRvX2NpcGhlcl90Zm0odGZtKSwgZmxhZ3MpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2NpcGhlcl9jbGVhcl9mbGFncyhzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLAoJCQkJCSAgICAgdTMyIGZsYWdzKQp7CgljcnlwdG9fdGZtX2NsZWFyX2ZsYWdzKGNyeXB0b19jaXBoZXJfdGZtKHRmbSksIGZsYWdzKTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9zZXRrZXkoc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKewoJcmV0dXJuIGNyeXB0b19jaXBoZXJfY3J0KHRmbSktPmNpdF9zZXRrZXkoY3J5cHRvX2NpcGhlcl90Zm0odGZtKSwKCQkJCQkJICBrZXksIGtleWxlbik7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0sCgkJCQkJICAgICB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQp7CgljcnlwdG9fY2lwaGVyX2NydCh0Zm0pLT5jaXRfZW5jcnlwdF9vbmUoY3J5cHRvX2NpcGhlcl90Zm0odGZtKSwKCQkJCQkJZHN0LCBzcmMpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0X29uZShzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLAoJCQkJCSAgICAgdTggKmRzdCwgY29uc3QgdTggKnNyYykKewoJY3J5cHRvX2NpcGhlcl9jcnQodGZtKS0+Y2l0X2RlY3J5cHRfb25lKGNyeXB0b19jaXBoZXJfdGZtKHRmbSksCgkJCQkJCWRzdCwgc3JjKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2hhc2ggKl9fY3J5cHRvX2hhc2hfY2FzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglyZXR1cm4gKHN0cnVjdCBjcnlwdG9faGFzaCAqKXRmbTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2hhc2ggKmNyeXB0b19oYXNoX2Nhc3Qoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJQlVHX09OKChjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgXiBDUllQVE9fQUxHX1RZUEVfSEFTSCkgJgoJICAgICAgIENSWVBUT19BTEdfVFlQRV9IQVNIX01BU0spOwoJcmV0dXJuIF9fY3J5cHRvX2hhc2hfY2FzdCh0Zm0pOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9faGFzaCAqY3J5cHRvX2FsbG9jX2hhc2goY29uc3QgY2hhciAqYWxnX25hbWUsCgkJCQkJCSAgICB1MzIgdHlwZSwgdTMyIG1hc2spCnsKCXR5cGUgJj0gfkNSWVBUT19BTEdfVFlQRV9NQVNLOwoJdHlwZSB8PSBDUllQVE9fQUxHX1RZUEVfSEFTSDsKCW1hc2sgfD0gQ1JZUFRPX0FMR19UWVBFX0hBU0hfTUFTSzsKCglyZXR1cm4gX19jcnlwdG9faGFzaF9jYXN0KGNyeXB0b19hbGxvY19iYXNlKGFsZ19uYW1lLCB0eXBlLCBtYXNrKSk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19oYXNoX3RmbShzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSkKewoJcmV0dXJuICZ0Zm0tPmJhc2U7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZnJlZV9oYXNoKHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtKQp7CgljcnlwdG9fZnJlZV90Zm0oY3J5cHRvX2hhc2hfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9faGFzX2hhc2goY29uc3QgY2hhciAqYWxnX25hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKewoJdHlwZSAmPSB+Q1JZUFRPX0FMR19UWVBFX01BU0s7Cgl0eXBlIHw9IENSWVBUT19BTEdfVFlQRV9IQVNIOwoJbWFzayB8PSBDUllQVE9fQUxHX1RZUEVfSEFTSF9NQVNLOwoKCXJldHVybiBjcnlwdG9faGFzX2FsZyhhbGdfbmFtZSwgdHlwZSwgbWFzayk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGhhc2hfdGZtICpjcnlwdG9faGFzaF9jcnQoc3RydWN0IGNyeXB0b19oYXNoICp0Zm0pCnsKCXJldHVybiAmY3J5cHRvX2hhc2hfdGZtKHRmbSktPmNydF9oYXNoOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9faGFzaF9ibG9ja3NpemUoc3RydWN0IGNyeXB0b19oYXNoICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3J5cHRvX2hhc2hfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9faGFzaF9hbGlnbm1hc2soc3RydWN0IGNyeXB0b19oYXNoICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2soY3J5cHRvX2hhc2hfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9faGFzaF9kaWdlc3RzaXplKHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX2hhc2hfY3J0KHRmbSktPmRpZ2VzdHNpemU7Cn0KCnN0YXRpYyBpbmxpbmUgdTMyIGNyeXB0b19oYXNoX2dldF9mbGFncyhzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSkKewoJcmV0dXJuIGNyeXB0b190Zm1fZ2V0X2ZsYWdzKGNyeXB0b19oYXNoX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19oYXNoX3NldF9mbGFncyhzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSwgdTMyIGZsYWdzKQp7CgljcnlwdG9fdGZtX3NldF9mbGFncyhjcnlwdG9faGFzaF90Zm0odGZtKSwgZmxhZ3MpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2hhc2hfY2xlYXJfZmxhZ3Moc3RydWN0IGNyeXB0b19oYXNoICp0Zm0sIHUzMiBmbGFncykKewoJY3J5cHRvX3RmbV9jbGVhcl9mbGFncyhjcnlwdG9faGFzaF90Zm0odGZtKSwgZmxhZ3MpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9faGFzaF9pbml0KHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MpCnsKCXJldHVybiBjcnlwdG9faGFzaF9jcnQoZGVzYy0+dGZtKS0+aW5pdChkZXNjKTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2hhc2hfdXBkYXRlKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsCgkJCQkgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCgkJCQkgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCnsKCXJldHVybiBjcnlwdG9faGFzaF9jcnQoZGVzYy0+dGZtKS0+dXBkYXRlKGRlc2MsIHNnLCBuYnl0ZXMpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9faGFzaF9maW5hbChzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLCB1OCAqb3V0KQp7CglyZXR1cm4gY3J5cHRvX2hhc2hfY3J0KGRlc2MtPnRmbSktPmZpbmFsKGRlc2MsIG91dCk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19oYXNoX2RpZ2VzdChzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLAoJCQkJICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAoJCQkJICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqb3V0KQp7CglyZXR1cm4gY3J5cHRvX2hhc2hfY3J0KGRlc2MtPnRmbSktPmRpZ2VzdChkZXNjLCBzZywgbmJ5dGVzLCBvdXQpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9faGFzaF9zZXRrZXkoc3RydWN0IGNyeXB0b19oYXNoICpoYXNoLAoJCQkJICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQp7CglyZXR1cm4gY3J5cHRvX2hhc2hfY3J0KGhhc2gpLT5zZXRrZXkoaGFzaCwga2V5LCBrZXlsZW4pOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fY29tcCAqX19jcnlwdG9fY29tcF9jYXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiAoc3RydWN0IGNyeXB0b19jb21wICopdGZtOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fY29tcCAqY3J5cHRvX2NvbXBfY2FzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglCVUdfT04oKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSBeIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUykgJgoJICAgICAgIENSWVBUT19BTEdfVFlQRV9NQVNLKTsKCXJldHVybiBfX2NyeXB0b19jb21wX2Nhc3QodGZtKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2NvbXAgKmNyeXB0b19hbGxvY19jb21wKGNvbnN0IGNoYXIgKmFsZ19uYW1lLAoJCQkJCQkgICAgdTMyIHR5cGUsIHUzMiBtYXNrKQp7Cgl0eXBlICY9IH5DUllQVE9fQUxHX1RZUEVfTUFTSzsKCXR5cGUgfD0gQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTOwoJbWFzayB8PSBDUllQVE9fQUxHX1RZUEVfTUFTSzsKCglyZXR1cm4gX19jcnlwdG9fY29tcF9jYXN0KGNyeXB0b19hbGxvY19iYXNlKGFsZ19uYW1lLCB0eXBlLCBtYXNrKSk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19jb21wX3RmbShzdHJ1Y3QgY3J5cHRvX2NvbXAgKnRmbSkKewoJcmV0dXJuICZ0Zm0tPmJhc2U7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZnJlZV9jb21wKHN0cnVjdCBjcnlwdG9fY29tcCAqdGZtKQp7CgljcnlwdG9fZnJlZV90Zm0oY3J5cHRvX2NvbXBfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9faGFzX2NvbXAoY29uc3QgY2hhciAqYWxnX25hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKewoJdHlwZSAmPSB+Q1JZUFRPX0FMR19UWVBFX01BU0s7Cgl0eXBlIHw9IENSWVBUT19BTEdfVFlQRV9DT01QUkVTUzsKCW1hc2sgfD0gQ1JZUFRPX0FMR19UWVBFX01BU0s7CgoJcmV0dXJuIGNyeXB0b19oYXNfYWxnKGFsZ19uYW1lLCB0eXBlLCBtYXNrKTsKfQoKc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjcnlwdG9fY29tcF9uYW1lKHN0cnVjdCBjcnlwdG9fY29tcCAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9hbGdfbmFtZShjcnlwdG9fY29tcF90Zm0odGZtKSk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNvbXByZXNzX3RmbSAqY3J5cHRvX2NvbXBfY3J0KHN0cnVjdCBjcnlwdG9fY29tcCAqdGZtKQp7CglyZXR1cm4gJmNyeXB0b19jb21wX3RmbSh0Zm0pLT5jcnRfY29tcHJlc3M7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jb21wX2NvbXByZXNzKHN0cnVjdCBjcnlwdG9fY29tcCAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQp7CglyZXR1cm4gY3J5cHRvX2NvbXBfY3J0KHRmbSktPmNvdF9jb21wcmVzcyhjcnlwdG9fY29tcF90Zm0odGZtKSwKCQkJCQkJICBzcmMsIHNsZW4sIGRzdCwgZGxlbik7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jb21wX2RlY29tcHJlc3Moc3RydWN0IGNyeXB0b19jb21wICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQp7CglyZXR1cm4gY3J5cHRvX2NvbXBfY3J0KHRmbSktPmNvdF9kZWNvbXByZXNzKGNyeXB0b19jb21wX3RmbSh0Zm0pLAoJCQkJCQkgICAgc3JjLCBzbGVuLCBkc3QsIGRsZW4pOwp9CgojZW5kaWYJLyogX0xJTlVYX0NSWVBUT19IICovCgo=