LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA2LTIwMDggVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFR4LiwgVVNBCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIENvcHlyaWdodCAyMDA5IFZNd2FyZSwgSW5jLiwgUGFsbyBBbHRvLCBDQS4sIFVTQQogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAogKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCiAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgogKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCiAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogQXV0aG9yczogVGhvbWFzIEhlbGxzdHL2bSA8dGhvbWFzLWF0LXR1bmdzdGVuZ3JhcGhpY3MtZG90LWNvbT4KICovCiNpZmRlZiBIQVZFX0NPTkZJR19ICiNpbmNsdWRlICJjb25maWcuaCIKI2VuZGlmCgojaW5jbHVkZSA8eGY4NmRybS5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzeXMvbW1hbi5oPgojaW5jbHVkZSA8ZHJtL3BzYl90dG1fcGxhY2VtZW50X3VzZXIuaD4KI2luY2x1ZGUgIndzYm1fcG9vbC5oIgojaW5jbHVkZSAiYXNzZXJ0LmgiCiNpbmNsdWRlICJ3c2JtX3ByaXYuaCIKI2luY2x1ZGUgIndzYm1fbWFuYWdlci5oIgoKI2RlZmluZSBEUk1SRVNUQVJUQ09NTUFORFdSSVRFKF9mZCwgX3ZhbCwgX2FyZywgX3JldCkJCQlcCglkbyB7CQkJCQkJCQlcCgkJKF9yZXQpID0gZHJtQ29tbWFuZFdyaXRlKF9mZCwgX3ZhbCwgJihfYXJnKSwgc2l6ZW9mKF9hcmcpKTsgXAoJfSB3aGlsZSAoKF9yZXQpID09IC1FQUdBSU4gfHwgKF9yZXQpID09IC1FUkVTVEFSVCk7CQlcCgojZGVmaW5lIERSTVJFU1RBUlRDT01NQU5EV1JJVEVSRUFEKF9mZCwgX3ZhbCwgX2FyZywgX3JldCkJCVwKCWRvIHsJCQkJCQkJCVwKCQkoX3JldCkgPSBkcm1Db21tYW5kV3JpdGVSZWFkKF9mZCwgX3ZhbCwgJihfYXJnKSwgc2l6ZW9mKF9hcmcpKTsgXAoJfSB3aGlsZSAoKF9yZXQpID09IC1FQUdBSU4gfHwgKF9yZXQpID09IC1FUkVTVEFSVCk7CQlcCgovKgogKiBCdWZmZXIgcG9vbCBpbXBsZW1lbnRhdGlvbiB1c2luZyBEUk0gYnVmZmVyIG9iamVjdHMgYXMgd3NibSBidWZmZXIgb2JqZWN0cy4KICovCgpzdHJ1Y3QgX1RUTUJ1ZmZlcgp7CiAgICBzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlIGJ1ZjsKICAgIHN0cnVjdCBfV3NibUNvbmQgZXZlbnQ7CgogICAgLyoKICAgICAqIFJlbWFpbnMgY29uc3RhbnQgYWZ0ZXIgY3JlYXRpb24uCiAgICAgKi8KCiAgICB1aW50NjRfdCByZXF1ZXN0ZWRTaXplOwogICAgdWludDY0X3QgbWFwSGFuZGxlOwogICAgdWludDY0X3QgcmVhbFNpemU7CgogICAgLyoKICAgICAqIFByb3RlY3RlZCBieSB0aGUga2VybmVsIGxvY2suCiAgICAgKi8KCiAgICBzdHJ1Y3QgX1dzYm1LZXJuZWxCdWYga0J1ZjsKCiAgICAvKgogICAgICogUHJvdGVjdGVkIGJ5IHRoZSBtdXRleC4KICAgICAqLwoKICAgIHZvaWQgKnZpcnR1YWw7CiAgICBpbnQgc3luY0luUHJvZ3Jlc3M7CiAgICB1bnNpZ25lZCByZWFkZXJzOwogICAgdW5zaWduZWQgd3JpdGVyczsKfTsKCnN0cnVjdCBfVFRNUG9vbAp7CiAgICBzdHJ1Y3QgX1dzYm1CdWZmZXJQb29sIHBvb2w7CiAgICB1bnNpZ25lZCBpbnQgcGFnZVNpemU7CiAgICB1bnNpZ25lZCBpbnQgZGV2T2Zmc2V0Owp9OwoKc3RhdGljIGlubGluZSBzdHJ1Y3QgX1RUTVBvb2wgKgp0dG1HZXRQb29sKHN0cnVjdCBfVFRNQnVmZmVyICpkQnVmKQp7CiAgICByZXR1cm4gY29udGFpbmVyT2YoZEJ1Zi0+YnVmLnBvb2wsIHN0cnVjdCBfVFRNUG9vbCwgcG9vbCk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IF9UVE1CdWZmZXIgKgp0dG1CdWZmZXIoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqYnVmKQp7CiAgICByZXR1cm4gY29udGFpbmVyT2YoYnVmLCBzdHJ1Y3QgX1RUTUJ1ZmZlciwgYnVmKTsKfQoKc3RhdGljIHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKgpwb29sX2NyZWF0ZShzdHJ1Y3QgX1dzYm1CdWZmZXJQb29sICpwb29sLAoJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdWludDMyX3QgcGxhY2VtZW50LCB1bnNpZ25lZCBhbGlnbm1lbnQpCnsKICAgIHN0cnVjdCBfVFRNQnVmZmVyICpkQnVmID0gKHN0cnVjdCBfVFRNQnVmZmVyICopCgljYWxsb2MoMSwgc2l6ZW9mKCpkQnVmKSk7CiAgICBzdHJ1Y3QgX1RUTVBvb2wgKnR0bVBvb2wgPSBjb250YWluZXJPZihwb29sLCBzdHJ1Y3QgX1RUTVBvb2wsIHBvb2wpOwogICAgaW50IHJldDsKICAgIHVuc2lnbmVkIHBhZ2VTaXplID0gdHRtUG9vbC0+cGFnZVNpemU7CiAgICB1bmlvbiB0dG1fcGxfY3JlYXRlX2FyZyBhcmc7CgogICAgaWYgKCFkQnVmKQoJcmV0dXJuIE5VTEw7CgogICAgaWYgKChhbGlnbm1lbnQgPiBwYWdlU2l6ZSkgJiYgKGFsaWdubWVudCAlIHBhZ2VTaXplKSkKCWdvdG8gb3V0X2VycjA7CgogICAgcmV0ID0gd3NibUJ1ZlN0b3JhZ2VJbml0KCZkQnVmLT5idWYsIHBvb2wpOwogICAgaWYgKHJldCkKCWdvdG8gb3V0X2VycjA7CgogICAgcmV0ID0gV1NCTV9DT05EX0lOSVQoJmRCdWYtPmV2ZW50KTsKICAgIGlmIChyZXQpCglnb3RvIG91dF9lcnIxOwoKICAgIGFyZy5yZXEuc2l6ZSA9IHNpemU7CiAgICBhcmcucmVxLnBsYWNlbWVudCA9IHBsYWNlbWVudDsKICAgIGFyZy5yZXEucGFnZV9hbGlnbm1lbnQgPSBhbGlnbm1lbnQgLyBwYWdlU2l6ZTsKCiAgICBEUk1SRVNUQVJUQ09NTUFORFdSSVRFUkVBRChwb29sLT5mZCwgdHRtUG9vbC0+ZGV2T2Zmc2V0ICsgVFRNX1BMX0NSRUFURSwKCQkJICAgICAgIGFyZywgcmV0KTsKCiAgICBpZiAocmV0KQoJZ290byBvdXRfZXJyMjsKCiAgICBkQnVmLT5yZXF1ZXN0ZWRTaXplID0gc2l6ZTsKICAgIGRCdWYtPmtCdWYuZ3B1T2Zmc2V0ID0gYXJnLnJlcC5ncHVfb2Zmc2V0OwogICAgZEJ1Zi0+bWFwSGFuZGxlID0gYXJnLnJlcC5tYXBfaGFuZGxlOwogICAgZEJ1Zi0+cmVhbFNpemUgPSBhcmcucmVwLmJvX3NpemU7CiAgICBkQnVmLT5rQnVmLnBsYWNlbWVudCA9IGFyZy5yZXAucGxhY2VtZW50OwogICAgZEJ1Zi0+a0J1Zi5oYW5kbGUgPSBhcmcucmVwLmhhbmRsZTsKCiAgICByZXR1cm4gJmRCdWYtPmJ1ZjsKCiAgb3V0X2VycjI6CiAgICBXU0JNX0NPTkRfRlJFRSgmZEJ1Zi0+ZXZlbnQpOwogIG91dF9lcnIxOgogICAgd3NibUJ1ZlN0b3JhZ2VUYWtlZG93bigmZEJ1Zi0+YnVmKTsKICBvdXRfZXJyMDoKICAgIGZyZWUoZEJ1Zik7CiAgICByZXR1cm4gTlVMTDsKfQoKc3RhdGljIHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKgpwb29sX3JlZmVyZW5jZShzdHJ1Y3QgX1dzYm1CdWZmZXJQb29sICpwb29sLCB1bnNpZ25lZCBoYW5kbGUpCnsKICAgIHN0cnVjdCBfVFRNQnVmZmVyICpkQnVmID0gKHN0cnVjdCBfVFRNQnVmZmVyICopY2FsbG9jKDEsIHNpemVvZigqZEJ1ZikpOwogICAgc3RydWN0IF9UVE1Qb29sICp0dG1Qb29sID0gY29udGFpbmVyT2YocG9vbCwgc3RydWN0IF9UVE1Qb29sLCBwb29sKTsKICAgIHVuaW9uIHR0bV9wbF9yZWZlcmVuY2VfYXJnIGFyZzsKICAgIGludCByZXQ7CgogICAgaWYgKCFkQnVmKQoJcmV0dXJuIE5VTEw7CgogICAgcmV0ID0gd3NibUJ1ZlN0b3JhZ2VJbml0KCZkQnVmLT5idWYsIHBvb2wpOwogICAgaWYgKHJldCkKCWdvdG8gb3V0X2VycjA7CgogICAgcmV0ID0gV1NCTV9DT05EX0lOSVQoJmRCdWYtPmV2ZW50KTsKICAgIGlmIChyZXQpCglnb3RvIG91dF9lcnIxOwoKICAgIGFyZy5yZXEuaGFuZGxlID0gaGFuZGxlOwogICAgcmV0ID0gZHJtQ29tbWFuZFdyaXRlUmVhZChwb29sLT5mZCwgdHRtUG9vbC0+ZGV2T2Zmc2V0ICsgVFRNX1BMX1JFRkVSRU5DRSwKCQkJICAgICAgJmFyZywgc2l6ZW9mKGFyZykpOwoKICAgIGlmIChyZXQpCglnb3RvIG91dF9lcnIyOwoKICAgIGRCdWYtPnJlcXVlc3RlZFNpemUgPSBhcmcucmVwLmJvX3NpemU7CiAgICBkQnVmLT5rQnVmLmdwdU9mZnNldCA9IGFyZy5yZXAuZ3B1X29mZnNldDsKICAgIGRCdWYtPm1hcEhhbmRsZSA9IGFyZy5yZXAubWFwX2hhbmRsZTsKICAgIGRCdWYtPnJlYWxTaXplID0gYXJnLnJlcC5ib19zaXplOwogICAgZEJ1Zi0+a0J1Zi5wbGFjZW1lbnQgPSBhcmcucmVwLnBsYWNlbWVudDsKICAgIGRCdWYtPmtCdWYuaGFuZGxlID0gYXJnLnJlcC5oYW5kbGU7CiAgICBkQnVmLT5rQnVmLmZlbmNlX3R5cGVfbWFzayA9IGFyZy5yZXAuc3luY19vYmplY3RfYXJnOwoKICAgIHJldHVybiAmZEJ1Zi0+YnVmOwoKICBvdXRfZXJyMjoKICAgIFdTQk1fQ09ORF9GUkVFKCZkQnVmLT5ldmVudCk7CiAgb3V0X2VycjE6CiAgICB3c2JtQnVmU3RvcmFnZVRha2Vkb3duKCZkQnVmLT5idWYpOwogIG91dF9lcnIwOgogICAgZnJlZShkQnVmKTsKICAgIHJldHVybiBOVUxMOwp9CgpzdGF0aWMgdm9pZApwb29sX2Rlc3Ryb3koc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqKmJ1ZikKewogICAgc3RydWN0IF9UVE1CdWZmZXIgKmRCdWYgPSB0dG1CdWZmZXIoKmJ1Zik7CiAgICBzdHJ1Y3QgX1RUTVBvb2wgKnR0bVBvb2wgPSB0dG1HZXRQb29sKGRCdWYpOwogICAgc3RydWN0IHR0bV9wbF9yZWZlcmVuY2VfcmVxIGFyZzsKCiAgICAqYnVmID0gTlVMTDsKICAgIGlmIChkQnVmLT52aXJ0dWFsICE9IE5VTEwpIHsKCSh2b2lkKW11bm1hcChkQnVmLT52aXJ0dWFsLCBkQnVmLT5yZXF1ZXN0ZWRTaXplKTsKCWRCdWYtPnZpcnR1YWwgPSBOVUxMOwogICAgfQogICAgYXJnLmhhbmRsZSA9IGRCdWYtPmtCdWYuaGFuZGxlOwogICAgKHZvaWQpZHJtQ29tbWFuZFdyaXRlKGRCdWYtPmJ1Zi5wb29sLT5mZCwKCQkJICB0dG1Qb29sLT5kZXZPZmZzZXQgKyBUVE1fUExfVU5SRUYsCgkJCSAgJmFyZywgc2l6ZW9mKGFyZykpOwoKICAgIFdTQk1fQ09ORF9GUkVFKCZkQnVmLT5ldmVudCk7CiAgICB3c2JtQnVmU3RvcmFnZVRha2Vkb3duKCZkQnVmLT5idWYpOwogICAgZnJlZShkQnVmKTsKfQoKc3RhdGljIGludApzeW5jZm9yY3B1X2xvY2tlZChzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpidWYsIHVuc2lnbmVkIG1vZGUpCnsKICAgIHVpbnQzMl90IGttb2RlID0gMDsKICAgIHN0cnVjdCBfVFRNQnVmZmVyICpkQnVmID0gdHRtQnVmZmVyKGJ1Zik7CiAgICBzdHJ1Y3QgX1RUTVBvb2wgKnR0bVBvb2wgPSB0dG1HZXRQb29sKGRCdWYpOwogICAgdW5zaWduZWQgaW50IHJlYWRlcnM7CiAgICB1bnNpZ25lZCBpbnQgd3JpdGVyczsKICAgIGludCByZXQgPSAwOwoKICAgIHdoaWxlIChkQnVmLT5zeW5jSW5Qcm9ncmVzcykKCVdTQk1fQ09ORF9XQUlUKCZkQnVmLT5ldmVudCwgJmJ1Zi0+bXV0ZXgpOwoKICAgIHJlYWRlcnMgPSBkQnVmLT5yZWFkZXJzOwogICAgd3JpdGVycyA9IGRCdWYtPndyaXRlcnM7CgogICAgaWYgKChtb2RlICYgV1NCTV9TWU5DQ1BVX1JFQUQpICYmICgrK2RCdWYtPnJlYWRlcnMgPT0gMSkpCglrbW9kZSB8PSBUVE1fUExfU1lOQ0NQVV9NT0RFX1JFQUQ7CgogICAgaWYgKChtb2RlICYgV1NCTV9TWU5DQ1BVX1dSSVRFKSAmJiAoKytkQnVmLT53cml0ZXJzID09IDEpKQoJa21vZGUgfD0gVFRNX1BMX1NZTkNDUFVfTU9ERV9XUklURTsKCiAgICBpZiAoa21vZGUpIHsKCXN0cnVjdCB0dG1fcGxfc3luY2NwdV9hcmcgYXJnOwoKCWlmIChtb2RlICYgV1NCTV9TWU5DQ1BVX0RPTlRfQkxPQ0spCgkgICAga21vZGUgfD0gVFRNX1BMX1NZTkNDUFVfTU9ERV9OT19CTE9DSzsKCglkQnVmLT5zeW5jSW5Qcm9ncmVzcyA9IDE7CgoJLyoKCSAqIFRoaXMgbWlnaHQgYmUgYSBsZW5ndGh5IHdhaXQsIHNvCgkgKiByZWxlYXNlIHRoZSBtdXRleC4KCSAqLwoKCVdTQk1fTVVURVhfVU5MT0NLKCZidWYtPm11dGV4KTsKCglhcmcuaGFuZGxlID0gZEJ1Zi0+a0J1Zi5oYW5kbGU7CglhcmcuYWNjZXNzX21vZGUgPSBrbW9kZTsKCWFyZy5vcCA9IFRUTV9QTF9TWU5DQ1BVX09QX0dSQUI7CgoJRFJNUkVTVEFSVENPTU1BTkRXUklURShkQnVmLT5idWYucG9vbC0+ZmQsCgkJCSAgICAgICB0dG1Qb29sLT5kZXZPZmZzZXQgKyBUVE1fUExfU1lOQ0NQVSwgYXJnLCByZXQpOwoKCVdTQk1fTVVURVhfTE9DSygmYnVmLT5tdXRleCk7CglkQnVmLT5zeW5jSW5Qcm9ncmVzcyA9IDA7CglXU0JNX0NPTkRfQlJPQURDQVNUKCZkQnVmLT5ldmVudCk7CgoJaWYgKHJldCkgewoJICAgIGRCdWYtPnJlYWRlcnMgPSByZWFkZXJzOwoJICAgIGRCdWYtPndyaXRlcnMgPSB3cml0ZXJzOwoJfQogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQKcmVsZWFzZWZyb21jcHVfbG9ja2VkKHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKmJ1ZiwgdW5zaWduZWQgbW9kZSkKewogICAgdWludDMyX3Qga21vZGUgPSAwOwogICAgc3RydWN0IF9UVE1CdWZmZXIgKmRCdWYgPSB0dG1CdWZmZXIoYnVmKTsKICAgIHN0cnVjdCBfVFRNUG9vbCAqdHRtUG9vbCA9IHR0bUdldFBvb2woZEJ1Zik7CiAgICBpbnQgcmV0ID0gMDsKCiAgICB3aGlsZSAoZEJ1Zi0+c3luY0luUHJvZ3Jlc3MpCglXU0JNX0NPTkRfV0FJVCgmZEJ1Zi0+ZXZlbnQsICZidWYtPm11dGV4KTsKCiAgICBpZiAoKG1vZGUgJiBXU0JNX1NZTkNDUFVfUkVBRCkgJiYgKC0tZEJ1Zi0+cmVhZGVycyA9PSAwKSkKCWttb2RlIHw9IFRUTV9QTF9TWU5DQ1BVX01PREVfUkVBRDsKCiAgICBpZiAoKG1vZGUgJiBXU0JNX1NZTkNDUFVfV1JJVEUpICYmICgtLWRCdWYtPndyaXRlcnMgPT0gMCkpCglrbW9kZSB8PSBUVE1fUExfU1lOQ0NQVV9NT0RFX1dSSVRFOwoKICAgIGlmIChrbW9kZSkgewoJc3RydWN0IHR0bV9wbF9zeW5jY3B1X2FyZyBhcmc7CgoJYXJnLmhhbmRsZSA9IGRCdWYtPmtCdWYuaGFuZGxlOwoJYXJnLmFjY2Vzc19tb2RlID0ga21vZGU7Cglhcmcub3AgPSBUVE1fUExfU1lOQ0NQVV9PUF9SRUxFQVNFOwoKCURSTVJFU1RBUlRDT01NQU5EV1JJVEUoZEJ1Zi0+YnVmLnBvb2wtPmZkLAoJCQkgICAgICAgdHRtUG9vbC0+ZGV2T2Zmc2V0ICsgVFRNX1BMX1NZTkNDUFUsIGFyZywgcmV0KTsKCiAgICB9CgogICAgcmV0dXJuIHJldDsKfQoKc3RhdGljIGludApwb29sX3N5bmNmb3JjcHUoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqYnVmLCB1bnNpZ25lZCBtb2RlKQp7CiAgICBpbnQgcmV0OwoKICAgIFdTQk1fTVVURVhfTE9DSygmYnVmLT5tdXRleCk7CiAgICByZXQgPSBzeW5jZm9yY3B1X2xvY2tlZChidWYsIG1vZGUpOwogICAgV1NCTV9NVVRFWF9VTkxPQ0soJmJ1Zi0+bXV0ZXgpOwogICAgcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQKcG9vbF9yZWxlYXNlZnJvbWNwdShzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpidWYsIHVuc2lnbmVkIG1vZGUpCnsKICAgIFdTQk1fTVVURVhfTE9DSygmYnVmLT5tdXRleCk7CiAgICAodm9pZClyZWxlYXNlZnJvbWNwdV9sb2NrZWQoYnVmLCBtb2RlKTsKICAgIFdTQk1fTVVURVhfVU5MT0NLKCZidWYtPm11dGV4KTsKfQoKI2lmZGVmIEFORFJPSUQKCi8qIE5vIGhlYWRlciBidXQgc3lzY2FsbCBwcm92aWRlZCBieSBiaW9uaWMgKi8Kdm9pZCogIF9fbW1hcDIodm9pZCosIHNpemVfdCwgaW50LCBpbnQsIGludCwgc2l6ZV90KTsKI2RlZmluZSBNTUFQMl9TSElGVCAxMiAvLyAyKioxMiA9PSA0MDk2CgpzdGF0aWMgdm9pZCogX3RlbXBfbW1hcCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgaW50IHByb3QsIGludCBmbGFncywgaW50IGZkLCBsb25nIGxvbmcgb2Zmc2V0KQp7CiAgICByZXR1cm4gX19tbWFwMihhZGRyLCBzaXplLCBwcm90LCBmbGFncywgZmQsICh1bnNpZ25lZCBsb25nKShvZmZzZXQgPj4gTU1BUDJfU0hJRlQpKTsKfQoKI2VuZGlmCgpzdGF0aWMgaW50CnBvb2xfbWFwKHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKmJ1ZiwgdW5zaWduZWQgbW9kZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSksIHZvaWQgKip2aXJ0dWFsKQp7CiAgICBzdHJ1Y3QgX1RUTUJ1ZmZlciAqZEJ1ZiA9IHR0bUJ1ZmZlcihidWYpOwogICAgdm9pZCAqdmlydDsKICAgIGludCByZXQgPSAwOwoKICAgIFdTQk1fTVVURVhfTE9DSygmYnVmLT5tdXRleCk7CgogICAgLyoKICAgICAqIG1tYXBzIGFyZSBleHBlbnNpdmUsIHNvIHdlIG9ubHkgcmVhbGx5IHVubWFwIGlmCiAgICAgKiB3ZSBkZXN0cm95IHRoZSBidWZmZXIuCiAgICAgKi8KCiAgICBpZiAoZEJ1Zi0+dmlydHVhbCA9PSBOVUxMKSB7CiNpZiBkZWZpbmVkKF9fTFA2NF9fKSB8fCBkZWZpbmVkKF9MUDY0KSB8fCBkZWZpbmVkKF9fTFA2NCkKCXZpcnQgPSBtbWFwKDAsIGRCdWYtPnJlcXVlc3RlZFNpemUsCgkJICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCgkJICAgIGJ1Zi0+cG9vbC0+ZmQsIGRCdWYtPm1hcEhhbmRsZSk7CiNlbHNlCgl2aXJ0ID0gX3RlbXBfbW1hcCgwLCBkQnVmLT5yZXF1ZXN0ZWRTaXplLAoJCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAoJCSAgICBidWYtPnBvb2wtPmZkLCBkQnVmLT5tYXBIYW5kbGUpOwojZW5kaWYKCWlmICh2aXJ0ID09IE1BUF9GQUlMRUQpIHsKCSAgICByZXQgPSAtZXJybm87CgkgICAgZ290byBvdXRfdW5sb2NrOwoJfQoJZEJ1Zi0+dmlydHVhbCA9IHZpcnQ7CiAgICB9CgogICAgKnZpcnR1YWwgPSBkQnVmLT52aXJ0dWFsOwogIG91dF91bmxvY2s6CgogICAgV1NCTV9NVVRFWF9VTkxPQ0soJmJ1Zi0+bXV0ZXgpOwoKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyB2b2lkCnBvb2xfdW5tYXAoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKewogICAgOwp9CgpzdGF0aWMgdW5zaWduZWQgbG9uZwpwb29sX29mZnNldChzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpidWYpCnsKICAgIHN0cnVjdCBfVFRNQnVmZmVyICpkQnVmID0gdHRtQnVmZmVyKGJ1Zik7CgogICAgcmV0dXJuIGRCdWYtPmtCdWYuZ3B1T2Zmc2V0Owp9CgpzdGF0aWMgdW5zaWduZWQgbG9uZwpwb29sX3Bvb2xPZmZzZXQoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqYnVmIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkKewogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB1aW50MzJfdApwb29sX3BsYWNlbWVudChzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpidWYpCnsKICAgIHN0cnVjdCBfVFRNQnVmZmVyICpkQnVmID0gdHRtQnVmZmVyKGJ1Zik7CgogICAgcmV0dXJuIGRCdWYtPmtCdWYucGxhY2VtZW50Owp9CgpzdGF0aWMgdW5zaWduZWQgbG9uZwpwb29sX3NpemUoc3RydWN0IF9Xc2JtQnVmU3RvcmFnZSAqYnVmKQp7CiAgICBzdHJ1Y3QgX1RUTUJ1ZmZlciAqZEJ1ZiA9IHR0bUJ1ZmZlcihidWYpOwoKICAgIHJldHVybiBkQnVmLT5yZWFsU2l6ZTsKfQoKc3RhdGljIHZvaWQKcG9vbF9mZW5jZShzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpidWYgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLAogICAgICAgIHN0cnVjdCBfV3NibUZlbmNlT2JqZWN0ICpmZW5jZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkpCnsKICAgIC8qCiAgICAgKiBOb29wLiBUaGUga2VybmVsIGhhbmRsZXMgYWxsIGZlbmNpbmcuCiAgICAgKi8KfQoKc3RhdGljIGludApwb29sX3dhaXRJZGxlKHN0cnVjdCBfV3NibUJ1ZlN0b3JhZ2UgKmJ1ZiwgaW50IGxhenkpCnsKICAgIHN0cnVjdCBfVFRNQnVmZmVyICpkQnVmID0gdHRtQnVmZmVyKGJ1Zik7CiAgICBzdHJ1Y3QgX1RUTVBvb2wgKnR0bVBvb2wgPSB0dG1HZXRQb29sKGRCdWYpOwogICAgc3RydWN0IHR0bV9wbF93YWl0aWRsZV9hcmcgcmVxOwogICAgc3RydWN0IF9Xc2JtQnVmZmVyUG9vbCAqcG9vbCA9IGJ1Zi0+cG9vbDsKICAgIGludCByZXQ7CgogICAgcmVxLmhhbmRsZSA9IGRCdWYtPmtCdWYuaGFuZGxlOwogICAgcmVxLm1vZGUgPSAobGF6eSkgPyBUVE1fUExfV0FJVElETEVfTU9ERV9MQVpZIDogMDsKCiAgICBEUk1SRVNUQVJUQ09NTUFORFdSSVRFKHBvb2wtPmZkLCB0dG1Qb29sLT5kZXZPZmZzZXQgKyBUVE1fUExfV0FJVElETEUsCgkJCSAgIHJlcSwgcmV0KTsKCiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZApwb29sX3Rha2Vkb3duKHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKnBvb2wpCnsKICAgIHN0cnVjdCBfVFRNUG9vbCAqdHRtUG9vbCA9IGNvbnRhaW5lck9mKHBvb2wsIHN0cnVjdCBfVFRNUG9vbCwgcG9vbCk7CgogICAgZnJlZSh0dG1Qb29sKTsKfQoKc3RhdGljIGludApwb29sX3NldFN0YXR1cyhzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpidWYsIHVpbnQzMl90IHNldF9wbGFjZW1lbnQsCgkgICAgICAgdWludDMyX3QgY2xyX3BsYWNlbWVudCkKewogICAgc3RydWN0IF9UVE1CdWZmZXIgKmRCdWYgPSB0dG1CdWZmZXIoYnVmKTsKICAgIHN0cnVjdCBfVFRNUG9vbCAqdHRtUG9vbCA9IHR0bUdldFBvb2woZEJ1Zik7CiAgICB1bmlvbiB0dG1fcGxfc2V0c3RhdHVzX2FyZyBhcmc7CiAgICBzdHJ1Y3QgdHRtX3BsX3NldHN0YXR1c19yZXEgKnJlcSA9ICZhcmcucmVxOwogICAgc3RydWN0IHR0bV9wbF9yZXAgKnJlcCA9ICZhcmcucmVwOwogICAgc3RydWN0IF9Xc2JtQnVmZmVyUG9vbCAqcG9vbCA9IGJ1Zi0+cG9vbDsKICAgIGludCByZXQ7CgogICAgcmVxLT5oYW5kbGUgPSBkQnVmLT5rQnVmLmhhbmRsZTsKICAgIHJlcS0+c2V0X3BsYWNlbWVudCA9IHNldF9wbGFjZW1lbnQ7CiAgICByZXEtPmNscl9wbGFjZW1lbnQgPSBjbHJfcGxhY2VtZW50OwoKICAgIERSTVJFU1RBUlRDT01NQU5EV1JJVEVSRUFEKHBvb2wtPmZkLAoJCQkgICAgICAgdHRtUG9vbC0+ZGV2T2Zmc2V0ICsgVFRNX1BMX1NFVFNUQVRVUywKCQkJICAgICAgIGFyZywgcmV0KTsKCiAgICBpZiAoIXJldCkgewoJZEJ1Zi0+a0J1Zi5ncHVPZmZzZXQgPSByZXAtPmdwdV9vZmZzZXQ7CglkQnVmLT5rQnVmLnBsYWNlbWVudCA9IHJlcC0+cGxhY2VtZW50OwogICAgfQoKICAgIHJldHVybiByZXQ7Cn0KCnN0YXRpYyBzdHJ1Y3QgX1dzYm1LZXJuZWxCdWYgKgpwb29sX2tlcm5lbChzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICpidWYpCnsKICAgIHJldHVybiAodm9pZCAqKSZ0dG1CdWZmZXIoYnVmKS0+a0J1ZjsKfQoKc3RydWN0IF9Xc2JtQnVmZmVyUG9vbCAqCndzYm1UVE1Qb29sSW5pdChpbnQgZmQsIHVuc2lnbmVkIGludCBkZXZPZmZzZXQpCnsKICAgIHN0cnVjdCBfVFRNUG9vbCAqdHRtUG9vbDsKICAgIHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKnBvb2w7CgogICAgdHRtUG9vbCA9IChzdHJ1Y3QgX1RUTVBvb2wgKiljYWxsb2MoMSwgc2l6ZW9mKCp0dG1Qb29sKSk7CgogICAgaWYgKCF0dG1Qb29sKQoJcmV0dXJuIE5VTEw7CgogICAgdHRtUG9vbC0+cGFnZVNpemUgPSBnZXRwYWdlc2l6ZSgpOwogICAgdHRtUG9vbC0+ZGV2T2Zmc2V0ID0gZGV2T2Zmc2V0OwogICAgcG9vbCA9ICZ0dG1Qb29sLT5wb29sOwoKICAgIHBvb2wtPmZkID0gZmQ7CiAgICBwb29sLT5tYXAgPSAmcG9vbF9tYXA7CiAgICBwb29sLT51bm1hcCA9ICZwb29sX3VubWFwOwogICAgcG9vbC0+c3luY2ZvcmNwdSA9ICZwb29sX3N5bmNmb3JjcHU7CiAgICBwb29sLT5yZWxlYXNlZnJvbWNwdSA9ICZwb29sX3JlbGVhc2Vmcm9tY3B1OwogICAgcG9vbC0+ZGVzdHJveSA9ICZwb29sX2Rlc3Ryb3k7CiAgICBwb29sLT5vZmZzZXQgPSAmcG9vbF9vZmZzZXQ7CiAgICBwb29sLT5wb29sT2Zmc2V0ID0gJnBvb2xfcG9vbE9mZnNldDsKICAgIHBvb2wtPnBsYWNlbWVudCA9ICZwb29sX3BsYWNlbWVudDsKICAgIHBvb2wtPnNpemUgPSAmcG9vbF9zaXplOwogICAgcG9vbC0+Y3JlYXRlID0gJnBvb2xfY3JlYXRlOwogICAgcG9vbC0+ZmVuY2UgPSAmcG9vbF9mZW5jZTsKICAgIHBvb2wtPmtlcm5lbCA9ICZwb29sX2tlcm5lbDsKICAgIHBvb2wtPnZhbGlkYXRlID0gTlVMTDsKICAgIHBvb2wtPnVudmFsaWRhdGUgPSBOVUxMOwogICAgcG9vbC0+d2FpdElkbGUgPSAmcG9vbF93YWl0SWRsZTsKICAgIHBvb2wtPnRha2VEb3duID0gJnBvb2xfdGFrZWRvd247CiAgICBwb29sLT5jcmVhdGVCeVJlZmVyZW5jZSA9ICZwb29sX3JlZmVyZW5jZTsKICAgIHBvb2wtPnNldFN0YXR1cyA9ICZwb29sX3NldFN0YXR1czsKICAgIHJldHVybiBwb29sOwp9CgpzdHJ1Y3QgX1dzYm1CdWZTdG9yYWdlICoKdHRtX3Bvb2xfdWJfY3JlYXRlKHN0cnVjdCBfV3NibUJ1ZmZlclBvb2wgKnBvb2wsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdWludDMyX3QgcGxhY2VtZW50LCB1bnNpZ25lZCBhbGlnbm1lbnQsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnVzZXJfcHRyLCBpbnQgZmQpCnsKICAgIHN0cnVjdCBfVFRNQnVmZmVyICpkQnVmID0gKHN0cnVjdCBfVFRNQnVmZmVyICopCgkgICAgY2FsbG9jKDEsIHNpemVvZigqZEJ1ZikpOwogICAgc3RydWN0IF9UVE1Qb29sICp0dG1Qb29sID0gY29udGFpbmVyT2YocG9vbCwgc3RydWN0IF9UVE1Qb29sLCBwb29sKTsKICAgIGludCByZXQ7CiAgICB1bnNpZ25lZCBwYWdlU2l6ZSA9IHR0bVBvb2wtPnBhZ2VTaXplOwogICAgdW5pb24gdHRtX3BsX2NyZWF0ZV91Yl9hcmcgYXJnOwoKICAgIGlmICghZEJ1ZikKCSAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoKGFsaWdubWVudCA+IHBhZ2VTaXplKSAmJiAoYWxpZ25tZW50ICUgcGFnZVNpemUpKQoJICAgIGdvdG8gb3V0X2VycjA7CgogICAgcmV0ID0gd3NibUJ1ZlN0b3JhZ2VJbml0KCZkQnVmLT5idWYsIHBvb2wpOwogICAgaWYgKHJldCkKCSAgICBnb3RvIG91dF9lcnIwOwoKICAgIHJldCA9IFdTQk1fQ09ORF9JTklUKCZkQnVmLT5ldmVudCk7CiAgICBpZiAocmV0KQoJICAgIGdvdG8gb3V0X2VycjE7CgogICAgYXJnLnJlcS5zaXplID0gc2l6ZTsKICAgIGFyZy5yZXEucGxhY2VtZW50ID0gcGxhY2VtZW50OwogICAgYXJnLnJlcS5wYWdlX2FsaWdubWVudCA9IGFsaWdubWVudCAvIHBhZ2VTaXplOwogICAgYXJnLnJlcS51c2VyX2FkZHJlc3MgPSAodW5zaWduZWQgbG9uZyl1c2VyX3B0cjsKICAgIGFyZy5yZXEuZmQgPSBmZDsKCiAgICBEUk1SRVNUQVJUQ09NTUFORFdSSVRFUkVBRChwb29sLT5mZCwgdHRtUG9vbC0+ZGV2T2Zmc2V0ICsgVFRNX1BMX0NSRUFURV9VQiwKCQkJICAgICAgIGFyZywgcmV0KTsKICAgIGlmIChyZXQpCiAgICAgICAgZ290byBvdXRfZXJyMjsKCiAgICBkQnVmLT5yZXF1ZXN0ZWRTaXplID0gc2l6ZTsKICAgIGRCdWYtPmtCdWYuZ3B1T2Zmc2V0ID0gYXJnLnJlcC5ncHVfb2Zmc2V0OwogICAgZEJ1Zi0+bWFwSGFuZGxlID0gYXJnLnJlcC5tYXBfaGFuZGxlOwogICAgZEJ1Zi0+cmVhbFNpemUgPSBhcmcucmVwLmJvX3NpemU7CiAgICBkQnVmLT5rQnVmLnBsYWNlbWVudCA9IGFyZy5yZXAucGxhY2VtZW50OwogICAgZEJ1Zi0+a0J1Zi5oYW5kbGUgPSBhcmcucmVwLmhhbmRsZTsKCiAgICByZXR1cm4gJmRCdWYtPmJ1ZjsKCiAgb3V0X2VycjI6CiAgICBXU0JNX0NPTkRfRlJFRSgmZEJ1Zi0+ZXZlbnQpOwogIG91dF9lcnIxOgogICAgd3NibUJ1ZlN0b3JhZ2VUYWtlZG93bigmZEJ1Zi0+YnVmKTsKICBvdXRfZXJyMDoKICAgIGZyZWUoZEJ1Zik7CiAgICByZXR1cm4gTlVMTDsKfQoK