LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqIENvcHlyaWdodCAyMDAzIEFsZXhhbmRyZSBKdWxsaWFyZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCiNkZWZpbmUgX0dOVV9TT1VSQ0UgLyogd2UgbWF5IG5lZWQgdG8gb3ZlcnJpZGUgc29tZSBHTlUgZXh0ZW5zaW9ucyAqLwoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzZXRqbXAuaD4KI2lmZGVmIEhBVkVfVU5JU1REX0gKIyBpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9TWVNfU09DS0VUX0gKIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaWZkZWYgSEFWRV9TWVNfTU1BTl9ICiNpbmNsdWRlIDxzeXMvbW1hbi5oPgojZW5kaWYKCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAid2ludGVybmwuaCIKI2luY2x1ZGUgIndpbmUvcHRocmVhZC5oIgoKI2RlZmluZSBQX09VVFBVVChzdHVmZikgd3JpdGUoMixzdHVmZixzdHJsZW4oc3R1ZmYpKQoKc3RhdGljIGNvbnN0IHN0cnVjdCB3aW5lX3B0aHJlYWRfZnVuY3Rpb25zIGZ1bmN0aW9uczsKCkRFQ0xfR0xPQkFMX0NPTlNUUlVDVE9SKHB0aHJlYWRfaW5pdCkgeyB3aW5lX3B0aHJlYWRfaW5pdF9wcm9jZXNzKCAmZnVuY3Rpb25zICk7IH0KCnN0YXRpYyBpbmxpbmUgaW50IGluaXRfZG9uZSh2b2lkKSB7IHJldHVybiBHZXRQcm9jZXNzSGVhcCgpICE9IDA7IH0KCi8qIE5PVEU6IFRoaXMgaXMgYSB0cnVseSBleHRyZW1lbHkgaW5jcmVkaWJseSB1Z2x5IGhhY2shCiAqIEJ1dCBpdCBkb2VzIHNlZW0gdG8gd29yay4uLiAqLwoKLyogYXNzdW1lIHRoYXQgcHRocmVhZF9tdXRleF90IGhhcyByb29tIGZvciBhdCBsZWFzdCBvbmUgcG9pbnRlciwKICogYW5kIGhvcGUgdGhhdCB0aGUgdXNlcnMgb2YgcHRocmVhZF9tdXRleF90IGNvbnNpZGVycyBpdCBvcGFxdWUKICogKG5ldmVyIGNoZWNrcyB3aGF0J3MgaW4gaXQpCiAqIGFsc286IGFzc3VtZSB0aGF0IHN0YXRpYyBpbml0aWFsaXplciBzZXRzIHBvaW50ZXIgdG8gTlVMTAogKi8KdHlwZWRlZiBzdHJ1Y3QKewojaWZkZWYgX19HTElCQ19fCiAgaW50IHJlc2VydmVkOwojZW5kaWYKICBDUklUSUNBTF9TRUNUSU9OICpjcml0c2VjdDsKfSAqd2luZV9tdXRleDsKCi8qIHNlZSB3aW5lX211dGV4IGFib3ZlIGZvciBjb21tZW50cyAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgUlRMX1JXTE9DSyAqbG9jazsKfSAqd2luZV9yd2xvY2s7CgpzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdAp7CiAgICB2b2lkKiAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQqKTsKICAgIHZvaWQqIGFyZzsKfTsKCnN0YXRpYyBEV09SRCBDQUxMQkFDSyBwdGhyZWFkX3RocmVhZF9zdGFydChMUFZPSUQgZGF0YSkKewogIHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0IGluaXQgPSAqKHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0KilkYXRhOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxkYXRhKTsKICByZXR1cm4gKERXT1JEKWluaXQuc3RhcnRfcm91dGluZShpbml0LmFyZyk7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2NyZWF0ZShwdGhyZWFkX3QqIHRocmVhZCwgY29uc3QgcHRocmVhZF9hdHRyX3QqIGF0dHIsIHZvaWQqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQgKiksIHZvaWQqIGFyZykKewogIEhBTkRMRSBoVGhyZWFkOwogIHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0KiBpZGF0YSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2Yoc3RydWN0IHB0aHJlYWRfdGhyZWFkX2luaXQpKTsKCiAgaWRhdGEtPnN0YXJ0X3JvdXRpbmUgPSBzdGFydF9yb3V0aW5lOwogIGlkYXRhLT5hcmcgPSBhcmc7CiAgaFRocmVhZCA9IENyZWF0ZVRocmVhZCggTlVMTCwgMCwgcHRocmVhZF90aHJlYWRfc3RhcnQsIGlkYXRhLCAwLCAoTFBEV09SRCl0aHJlYWQpOwoKICBpZihoVGhyZWFkKQogICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgZWxzZQogIHsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxpZGF0YSk7IC8qIGZyZWUgaWRhdGEgc3RydWN0IG9uIGZhaWx1cmUgKi8KICAgIHJldHVybiBFQUdBSU47CiAgfQoKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfY2FuY2VsKHB0aHJlYWRfdCB0aHJlYWQpCnsKICBIQU5ETEUgaFRocmVhZCA9IE9wZW5UaHJlYWQoVEhSRUFEX0FMTF9BQ0NFU1MsIEZBTFNFLCAoRFdPUkQpdGhyZWFkKTsKCiAgaWYoIVRlcm1pbmF0ZVRocmVhZChoVGhyZWFkLCAwKSkKICB7CiAgICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKICAgIHJldHVybiBFSU5WQUw7ICAgICAgLyogcmV0dXJuIGVycm9yICovCiAgfQoKICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKCiAgcmV0dXJuIDA7ICAgICAgICAgICAgIC8qIHJldHVybiBzdWNjZXNzICovCn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2pvaW4ocHRocmVhZF90IHRocmVhZCwgdm9pZCAqKnZhbHVlX3B0cikKewogIEhBTkRMRSBoVGhyZWFkID0gT3BlblRocmVhZChUSFJFQURfQUxMX0FDQ0VTUywgRkFMU0UsIChEV09SRCl0aHJlYWQpOwoKICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGhUaHJlYWQsIElORklOSVRFKTsKICBpZighR2V0RXhpdENvZGVUaHJlYWQoaFRocmVhZCwgKExQRFdPUkQpdmFsdWVfcHRyKSkKICB7CiAgICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKICAgIHJldHVybiBFSU5WQUw7IC8qIEZJWE1FOiBtYWtlIHRoaXMgbW9yZSBjb3JyZWN0bHkgbWF0Y2ggKi8KICB9ICAgICAgICAgICAgICAgIC8qIHdpbmRvd3MgZXJyb3JzICovCgogIENsb3NlSGFuZGxlKGhUaHJlYWQpOwogIHJldHVybiAwOwp9CgovKkZJWE1FOiBub3Qgc3VyZSB3aGF0IHRvIGRvIHdpdGggdGhpcyBvbmUuLi4gKi8Kc3RhdGljIGludCB3aW5lX3B0aHJlYWRfZGV0YWNoKHB0aHJlYWRfdCB0aHJlYWQpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9kZXRhY2hcbiIpOwogIHJldHVybiAwOwp9CgovKioqKiogTVVURVhFUyAqKioqKi8KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleF90ICptdXRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICptdXRleGF0dHIpCnsKICAvKiBnbGliYyBoYXMgYSB0ZW5kZW5jeSB0byBpbml0aWFsaXplIG11dGV4ZXMgdmVyeSBvZnRlbiwgZXZlbgogICAgIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhleSBhcmUgbm90IHJlYWxseSB1c2VkIGxhdGVyIG9uLgoKICAgICBBcyBmb3IgdXMsIGluaXRpYWxpemluZyBhIG11dGV4IGlzIHZlcnkgZXhwZW5zaXZlLCB3ZSBwb3N0cG9uZQogICAgIHRoZSByZWFsIGluaXRpYWxpemF0aW9uIHVudGlsIHRoZSB0aW1lIHRoZSBtdXRleCBpcyBmaXJzdCB1c2VkLiAqLwoKICAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIG11dGV4X3JlYWxfaW5pdCggcHRocmVhZF9tdXRleF90ICptdXRleCApCnsKICBDUklUSUNBTF9TRUNUSU9OICpjcml0c2VjdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoQ1JJVElDQUxfU0VDVElPTikpOwogIFJ0bEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oY3JpdHNlY3QpOwoKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKCh2b2lkKiopJigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCksY3JpdHNlY3QsTlVMTCkgIT0gTlVMTCkgewogICAgLyogdG9vIGxhdGUsIHNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgZGlkIGl0ICovCiAgICBSdGxEZWxldGVDcml0aWNhbFNlY3Rpb24oY3JpdHNlY3QpOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY3JpdHNlY3QpOwogIH0KfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfbXV0ZXhfbG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCFpbml0X2RvbmUoKSkgcmV0dXJuIDA7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkKICAgIG11dGV4X3JlYWxfaW5pdCggbXV0ZXggKTsKCiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9tdXRleF90cnlsb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoIWluaXRfZG9uZSgpKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KQogICAgbXV0ZXhfcmVhbF9pbml0KCBtdXRleCApOwoKICBpZiAoIVJ0bFRyeUVudGVyQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSkgewogICAgZXJybm8gPSBFQlVTWTsKICAgIHJldHVybiAtMTsKICB9CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX211dGV4X3VubG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkgcmV0dXJuIDA7CiAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9tdXRleF9kZXN0cm95KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSByZXR1cm4gMDsKICBpZiAoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QtPlJlY3Vyc2lvbkNvdW50KSB7CiNpZiAwIC8qIHRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIGxpYmM2IHRoYXQgbWFrZXMgdGhpcyBhIGJhZCBpZGVhICovCiAgICByZXR1cm4gRUJVU1k7CiNlbHNlCiAgICB3aGlsZSAoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QtPlJlY3Vyc2lvbkNvdW50KQogICAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiNlbmRpZgogIH0KICBSdGxEZWxldGVDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKiBSRUFELVdSSVRFIExPQ0tTICoqKioqLwoKc3RhdGljIHZvaWQgcndsb2NrX3JlYWxfaW5pdChwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBSVExfUldMT0NLICpsb2NrID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihSVExfUldMT0NLKSk7CiAgUnRsSW5pdGlhbGl6ZVJlc291cmNlKGxvY2spOwoKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKCh2b2lkKiopJigoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spLGxvY2ssTlVMTCkgIT0gTlVMTCkgewogICAgLyogdG9vIGxhdGUsIHNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgZGlkIGl0ICovCiAgICBSdGxEZWxldGVSZXNvdXJjZShsb2NrKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGxvY2spOwogIH0KfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfcndsb2NrX2luaXQocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrLCBjb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqcndsb2NrX2F0dHIpCnsKICAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2sgPSBOVUxMOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9yd2xvY2tfZGVzdHJveShwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykgcmV0dXJuIDA7CiAgUnRsRGVsZXRlUmVzb3VyY2UoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9yd2xvY2tfcmRsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghaW5pdF9kb25lKCkpIHJldHVybiAwOwogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIHdoaWxlKFRSVUUpCiAgICBpZiAoUnRsQWNxdWlyZVJlc291cmNlU2hhcmVkKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgVFJVRSkpCiAgICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghaW5pdF9kb25lKCkpIHJldHVybiAwOwogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIGlmICghUnRsQWNxdWlyZVJlc291cmNlU2hhcmVkKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgRkFMU0UpKSB7CiAgICBlcnJubyA9IEVCVVNZOwogICAgcmV0dXJuIC0xOwogIH0KICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfcndsb2NrX3dybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoIWluaXRfZG9uZSgpKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykKICAgIHJ3bG9ja19yZWFsX2luaXQoIHJ3bG9jayApOwoKICB3aGlsZShUUlVFKQogICAgaWYgKFJ0bEFjcXVpcmVSZXNvdXJjZUV4Y2x1c2l2ZSgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2ssIFRSVUUpKQogICAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoIWluaXRfZG9uZSgpKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykKICAgIHJ3bG9ja19yZWFsX2luaXQoIHJ3bG9jayApOwoKICBpZiAoIVJ0bEFjcXVpcmVSZXNvdXJjZUV4Y2x1c2l2ZSgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2ssIEZBTFNFKSkgewogICAgZXJybm8gPSBFQlVTWTsKICAgIHJldHVybiAtMTsKICB9CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX3J3bG9ja191bmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spIHJldHVybiAwOwogIFJ0bFJlbGVhc2VSZXNvdXJjZSggKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrICk7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKiBNSVNDICoqKioqLwoKc3RhdGljIHB0aHJlYWRfdCB3aW5lX3B0aHJlYWRfc2VsZih2b2lkKQp7CiAgcmV0dXJuIChwdGhyZWFkX3QpR2V0Q3VycmVudFRocmVhZElkKCk7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2VxdWFsKHB0aHJlYWRfdCB0aHJlYWQxLCBwdGhyZWFkX3QgdGhyZWFkMikKewogIHJldHVybiAoRFdPUkQpdGhyZWFkMSA9PSAoRFdPUkQpdGhyZWFkMjsKfQoKc3RhdGljIHZvaWQgd2luZV9wdGhyZWFkX2V4aXQodm9pZCAqcmV0dmFsLCBjaGFyICpjdXJyZW50ZnJhbWUpCnsKICAgIEV4aXRUaHJlYWQoKERXT1JEKXJldHZhbCk7Cn0KCnN0YXRpYyB2b2lkICp3aW5lX2dldF90aHJlYWRfZGF0YSh2b2lkKQp7CiAgICByZXR1cm4gTnRDdXJyZW50VGViKCktPnB0aHJlYWRfZGF0YTsKfQoKc3RhdGljIHZvaWQgd2luZV9zZXRfdGhyZWFkX2RhdGEoIHZvaWQgKmRhdGEgKQp7CiAgICBOdEN1cnJlbnRUZWIoKS0+cHRocmVhZF9kYXRhID0gZGF0YTsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCB3aW5lX3B0aHJlYWRfZnVuY3Rpb25zIGZ1bmN0aW9ucyA9CnsKICAgIHdpbmVfZ2V0X3RocmVhZF9kYXRhLCAgICAgICAgICAgLyogcHRyX2dldF90aHJlYWRfZGF0YSAqLwogICAgd2luZV9zZXRfdGhyZWFkX2RhdGEsICAgICAgICAgICAvKiBwdHJfc2V0X3RocmVhZF9kYXRhICovCiAgICB3aW5lX3B0aHJlYWRfc2VsZiwgICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX3NlbGYgKi8KICAgIHdpbmVfcHRocmVhZF9lcXVhbCwgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfZXF1YWwgKi8KICAgIHdpbmVfcHRocmVhZF9jcmVhdGUsICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfY3JlYXRlICovCiAgICB3aW5lX3B0aHJlYWRfY2FuY2VsLCAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2NhbmNlbCAqLwogICAgd2luZV9wdGhyZWFkX2pvaW4sICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9qb2luICovCiAgICB3aW5lX3B0aHJlYWRfZGV0YWNoLCAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2RldGFjaCAqLwogICAgd2luZV9wdGhyZWFkX2V4aXQsICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9leGl0ICovCiAgICB3aW5lX3B0aHJlYWRfbXV0ZXhfaW5pdCwgICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X2luaXQgKi8KICAgIHdpbmVfcHRocmVhZF9tdXRleF9sb2NrLCAgICAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfbG9jayAqLwogICAgd2luZV9wdGhyZWFkX211dGV4X3RyeWxvY2ssICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF90cnlsb2NrICovCiAgICB3aW5lX3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X3VubG9jayAqLwogICAgd2luZV9wdGhyZWFkX211dGV4X2Rlc3Ryb3ksICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF9kZXN0cm95ICovCiAgICB3aW5lX3B0aHJlYWRfcndsb2NrX2luaXQsICAgICAgIC8qIHB0cl9wdGhyZWFkX3J3bG9ja19pbml0ICovCiAgICB3aW5lX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3ksICAgIC8qIHB0cl9wdGhyZWFkX3J3bG9ja19kZXN0cm95ICovCiAgICB3aW5lX3B0aHJlYWRfcndsb2NrX3JkbG9jaywgICAgIC8qIHB0cl9wdGhyZWFkX3J3bG9ja19yZGxvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrLCAgLyogcHRyX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jayAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja193cmxvY2ssICAgICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfd3Jsb2NrICovCiAgICB3aW5lX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jaywgIC8qIHB0cl9wdGhyZWFkX3J3bG9ja190cnl3cmxvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9yd2xvY2tfdW5sb2NrICAgICAgLyogcHRyX3B0aHJlYWRfcndsb2NrX3VubG9jayAqLwp9Owo=